HTTP
HTTP(HyperText Transfer Protocol, 超文本传输协议)是访问万维网使用的核心通信协议。也是今天所有Web应用程序使用的通信协议。最初,HTTP只是一个为获取基于文本的静态资源而开发的简单协议,后来人们以各种形式扩展和利用它,时期能够支持如今常见的复杂分布式应用程序。
HTTP使用一种基于消息的模型:客户端送出一条请求消息,而后由服务器返回一条响应消息。该协议基本上不需要连接,虽然HTTP使用有状态的TCP协议作为它的传输机制,但每次请求与响应交换都自动完成,并且可能使用不同的TCP连接。
HTTP 请求
所有HTTP消息(请求与响应)中都包含一个或几个单行显示地消息头(header),然后是一个强制空白行,最后是消息主体(可选)。以下是一个典型的HTTP请求:
GET /auth/488/YourDetails.ashx?uid=129 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml
Referer: https://XXX
Accept-Language: en-GB
User-Agent: XXXX
Accept-Ecoding: gzip
Host: mdsec.net
Connection: Keep-Live
Cookid: SessionId=xxxxx
每个HTTP请求的第一行都由以3个空格间隔的项目组成。
- 一个说明HTTP方法的动词。最常用的方法为GET,它的主要作用是从Web服务器获取一个资源。GET 请求并没有消息主题,因此在消息头后的空白行中没有其他数据。
- 所请求的URL。该URL通常由所请求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成。在该URL中,查询字符串以?字符标识
- 使用的HTTP版本。
- Referer消息头用于表示发出请求的原始URL。
- User-Agent消息头提供与浏览器或其他生成请求的客户端软件有关的信息。
- Host消息头用于指定出现在被访问的完整URL中的主机名称。如果几个Web站点以相同的一台服务器为主机,就需要使用Host消息头。
- Cookie消息头用于提交服务器向客户端发布的其他参数。
HTTP响应
以下是一个典型的HTTP响应:
HTTP/1.1 200 OK
Date: Tue, 19, Apr 2011 09:23:12 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Set-Cookie: tracking=dddd
X-AspNet-Version: 2.0.44
Cache-Control: no-cache
Pragma: no-cache
Expires: Tue, 01, Jan 1970 00:00:00 GMT
Content-Type: text/html
Content-Length: 1078
dsddasda</>
每个HTTP响应的第一行由3个以空格间隔的项目组成。
- 使用的HTTP版本
- 表示请求结果的数字装填。
- 一段以文本形式的“原因短语”,进一步说明响应状态
HTTP方法
- GET方法的作用在于获取资源。它可以用与URL查询字符串的形式向所请求的资源发送参数。这是用户可将一个包含动态资源的URL标注为书签。
- POST方法主要作用是执行操作。使用这个方法可以在URL查询字符串与消息主体中发送请求参数。
- HEAD方法功能与GET方法类似,不同之处在于服务器不会再起响应中返回消息主体。服务器返回的消息头应与对应的GET请求的消息头相同。
- TRACE方法主要用于诊断。服务器应在响应主体中返回其受到的请求消息的具体内容。这种方法可用于检测客户端与服务器之是否存在任何操纵请求的代理服务器。
- OPTIONS方法要求服务器报告对某一特殊资源有效的HTTP方法。服务器通常返回一个包含ALLOW消息头的响应,并在其中列出所有有效的方法。
- PUT方法视图使用包含在请求主体中的内容,向服务器上传指定的资源。
URL
URL(Uniform Resource Location,统一资源定位符)是表示Web资源的唯一标识符,通过它即可获取其表示的资源。最常用的URL格式如下:
protocol://hostname[:port]/[path/]file[?parameter=value]
这个结构中有几个部分是可选的。如果端口号与相关协议使用的默认值不同,则只包含端口号即可。
REST
表述性状态转移(REST)设计分布式系统的一种体系架构,在这类体系架构中,请求和响应包含系统资源当前状态的表示。
HTTP消息头
HTTP支持许多不同的消息头,其中一些专用于特殊用途。一些消息头可用在请求与响应中,而其他一些消息头只能专门用在某个特定的消息中。
常用消息头
- Connection:这个消息头用于高速通信的另一端,在完成HTTP传输后是关闭TCP连接还是保持连接开放以接受其他消息。
- Content-Encoding:这个消息头为消息主体的内容指定编码形式,一些应用程序使用它来压缩响应以加快传输速度。
- Content-Length:这个消息头用于规定消息主体的字节长度。(HEAD语法的响应例外,它在对应的GET请求的响应中指出主体的长度)。
- Content-Type:用于规定消息主体的内容类型。
- Transfer-Encoding:指定为为方便其通过HTTP传输而对消息主体使用的任何编码。如果使用这个消息头,通常用它指定块编码。
请求消息头
- Accept:用于高速服务器客户端愿意接受哪些内容。
- Accept-Encoding:用于告诉服务器,客户端愿意接受哪些内容编码。
- Authorization:用于为一种内置HTTP身份向服务器提交证书。
- Cookie:用于向服务器提交它以前发布的Cookie
- Host:用于指定出现在所请求的完整URL中的主机名称。
- If-Modified-Since:用于说明浏览器最后一次受到所请求的资源的时间。如果自那以后资源没有发生变化,服务器就会发出一个带状态码的304响应,指示客户端使用资源的缓存副本。
- If-None-Match:用于制定一个实体标签。实体标签是一个说明消息主体内容的标识符。当最后一次受到所请求的资源时,浏览器提交服务器发布的实体标签。服务器可以使用实体标签确定浏览器是否使用资源的缓存副本。
- Origin:用在跨域Ajax请求中,用于指示提出请求的域。
- Referer:用于指示提出当前请求的原始URL
- User-Agent:提供与浏览器或生成请求的其他客户端软件有关的信息。
响应消息头
- Access-Control-Allow-Origin:用于指示是否可通过跨域Ajax请求获取资源。
- Cache-Control:用于向浏览器传送缓存指令。
- ETag:用于指定一个实体标签。客户端可在将来的请求中提交这个标识符,火哥和If-Non-Match消息头中相同的资源,通知服务器浏览器当前缓存中保存的是那个版本的资源。
- Expires:用于向浏览器说明消息主体内容的有效时间,在这个时间之前,浏览器可以使用这个资源的缓存副本。
- Location:用于在重定向响应中说明重定向的目标。
- Pragma:用于向浏览器传送缓存指令。
- Server:提供所使用的的Web服务器软件的相关信息。
- Set-Cookie:用于向浏览器发布Cookie,浏览器会在随后的请求中将其返回给服务器。
- WWW-Authenticate:用在带401的状态码响应中,提供与服务器所支持的身份验证类型有关的信息。
- X-Frame-Options:指示浏览器框架是否及如何加载当前响应。
Cookie
Cookie是大多数Web应用程序所依赖的HTTP协议的一个关键组成部分,攻击者常常通过它来利用Web程序中的漏洞。服务器使用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器。
Cookie一般由一个名/值对构成,但也可以包含任何不含空格的字符串。可以在服务器响应中使用几个Set-Cookie消息头发布多个Cookie,并可在同一个Cookie消息头中用逗号分隔不同的Cookie,将它们全部返回给服务器。
去除Cookie的实际值之外,Set-Cookie消息头还可以包含以下任何可选属性,用它们控制浏览器处理Cookie 的方式。
- expires:用于设定Cookie的有效时间。这样会使浏览器将Cookie保存在永久性的存储器中,在随后的浏览器会话中重复利用,直到到期时间为止。如果没有设定这个属性,那么Cookie仅用在当前浏览器会话中。
- domain:用于指定Cookie的有效域。这个域必须和受到Cookie的域相同,或者是它的父域。
- path:要几个与指定Cookie的有效URL路径。
- secure:如果设置这个属性,则仅在HTTPS请求中提交Cookie。
- HttpOnly:如果设置这个属性,将无法通过客户端JavaScript直接访问Cookie.
状态码
每条HTTP响应消息都必须在第一行中包含一个状态码,说明请求的结果。状态码可以分成以下5类:
- 1xx-提供信息
- 2xx-请求被成功提交
- 3xx-客户端被重定向到其他资源
- 4xx-请求包含某种错误
- 5xx-服务器执行请求时遇到错误。
常见的状态码
- 100 Continue:当客户端提交一个包含主体的请求时,将发送这个响应。该响应表示已经收到请求消息头,客户端应继续发送主体。请求完成后,再由服务器返回另一个响应。
- 200 OK。表示已成功提交请求,且响应主体包含请求结果。
- 201 Created:PUT请求的响应返回这个状态码,表示请求已成功提交。
- 301 Moved Permanently:本状态码将浏览器永久重定向到另外一个在Location消息头中指定的URL。以后客户端应使用新URL替换原始URL。
- 302 Found:本状态码将浏览器暂时重定向到另外一个在Location消息头中指定的URL。客户端应在随后的请求中恢复使用原始URL。
- 304 Not Modified:本状态码指示浏览器使用缓存中保存的所请求资源的副本。服务器使用If-Modified-Since与If-None-Match消息头确定客户端是否拥有最新版本的资源。
- 400 Bad Request:本状态码表示客户端提交了一个无效的HTTP请求。当以某种无效的方式修改请求时,可能会遇到这个错误码。
- 401 Unauthorized:服务器在许可请求前要求HTTP进行身份验证。WWW-Authenticate消息头详细说明所支持的身份验证类型。
- 403 Forbidden:本状态码之处,不管是否通过身份验证,禁止任何人访问被请求的资源。
- 404 Not Found:本状态码表示所请求的资源并不存在。
- 405 Method Not Allowed:本状态码表示指定的URL不支持请求中使用方法。
- 413 Request Entity Too Large:如果在本地代码中探查缓冲器溢出漏洞并就此提交超长数据串,则本状态码表示请求主体过长,服务器无法处理。
- 414 Request URI Too Long:与前一个响应类似,本状态码表示请求中的URL过长,服务器无法处理。
- 500 Internal Server Error:本状态码表示服务器在执行请求时遇到错误。当提交无法预料的输入、在应用程序处理过程中造成无法处理的错误时,通常会受到本状态码。
- 503 Service Unavailable:通常,本状态码表示尽管Web服务器运转正常,并且能够响应请求,但服务器访问的应用程序还是无法做出响应。
HTTPS
HTTP使用普通的非加密TCP作为其传输机制,因此,处在网络适当位置的攻击能够截取这个机制。HTTPS本质上与HTTP一样,都属于应用层协议,但HTTPS通过安全传输机制-安全套接层-传输数据。这种机制可保护通过网络传送的所有数据的隐秘性和完整性,显著降低非入侵式拦截攻击的可能性。不管是否使用SSL进行传输,HTTP请求与响应都以完全相同的方式工作。
HTTP代理
HTTP代理服务器是一个协调客户端与目标Web服务器之间访问的服务器。当配置浏览器使用代理服务器时,它会将所有请求提交到代理服务器,代理服务器再将请求转发给相关Web服务器,并将响应返回给浏览器。大多数代理还使用其他服务,如缓存,验证与访问控制。值得注意的是,如果使用代理服务器,HTTP的工作机制会出现两方面的差异。
- 当浏览器向代理服务器发布HTTP请求时,它会将完整的URL(包括协议前缀http://与服务器主机名称,在非标准URL中,还包括端口号)插入请求中。代理服务器将提取主机名称和端口,并使用这些信息将请求指向正确的目标的Web服务器。
- 当使用HTTPS时,浏览器无法与代理服务器进行SSL握手,因为这样做会破坏安全隧道,使通信易于遭受拦截攻击。因此,浏览器必须将代理作为一个纯粹的TCP级中继,由它传递浏览器与目标Web浏览器之间的所有网络数据,并与浏览器进行正常的SSL握手。浏览器使用CONNECT方法向代理服务器提交一个HTTP请求,并制定URL中的目标主机名称与端口号,从而建立这种中继。如果代理允许该请求,它会返回一个含200状态码的HTTP响应,一直开放TCP连接,从此以后作为目标服务器的纯粹TCP级中继。
从某种程度上说,攻击Web应用程序时最有用的工具是一个处在浏览器与目标Web站点之间的专用代理服务器,使他可以拦截并修改所有使用HTTPS的请求与响应。
HTTP身份验证
HTTP拥有自己的身份验证机制,使用不同的身份验证方案。
- Basic。这是一种非常简单的身份验证机制,它在请求消息头中随每条消息以Base64编码字符串形式发送用户证书。
- NTLM。这是一种质询-响应式机制,他使用某个Windows NTLM协议版本。
- Digest。这是一种质询-响应式机制,它随同用户证书一起使用一个随机值MD5校验和。
同源策略
同源策略是浏览器实施的一种关键机制,主要用于防止不同来源的内容相互干扰。基本上,从一个网站受到的内容可以读取并修改从该站点收到的其他内容,但不得访问从其他站点受到的内容。
如果不使用同源策略,那么当不知情的用户浏览到某个恶意网站时,在该网站上运行的脚本代码能够访问这名用户同时访问的任何其他网站的数据和功能。这样,该恶意站点就可以从用户的网上银行转账、阅读用户的Web邮件,火灾用户网上购物时拦截它的信用卡信息。为此,浏览器实施限制,只允许相同来源的内容进行交互。
关于同源策略,需要了解的一些主要特点如下:
- 位于一个域中的页面可以向另一个域提出任意数量的请求。但该页面本身无法处理上述请求返回的数据。
- 位于一个域中的页面可以加载来自其他域中的脚本并在自己的域中执行这个脚本。这是因为脚本被假定为包含代码,而非数据,因此跨域访问并不会泄露任何敏感信息。
- 位于一个域中的页面无法读取或修改属于另一个域的Cookie或者其他DOM数据。
编码方案
URL编码
URL只允许使用US-ASCII字符集中的可打印字符(也就是ACSII代码在0x20和0x7e范围内的字符)。而且,由于其在URL方案或HTTP协议内具有特殊含义,这个范围内的一些字符也不能用在URL中。
URL编码方案主要用于对扩展ASCII字符集中任何有问题的字符进行编码,使其可通过HTTP安全传输。任何URL编码的字符都以%为前缀,其后是这个字符的两位十六进制ASCII代码。
以下是一些常见的URL编码字符:
- %3d表示=
- %25表示%
- %20表示空格
- %0a表示新行
- %00表示空字节
另一个指的注意的编码字符是加号(+),它代表URL编码的空格(除%20代表空格外)。
Unicode编码
Unicode是一种为支持全世界所使用的的各种编写系统二十几的字符编码标准,它采用各种编码方案,其中一些课用于表示Web应用程序中的不常见字符。
16位Unicode编码的工作原理和URL编码类似。为通过HTTP进行传输,16位的Unicode编码的字符以%u为前缀,其后是这个字符的十六进制unicode码点。
UTF-8是一种长度可变的编码标准,它使用一个或几个字节表示每个字符。为通过HTTP进行传输,UTF-8编码的多字节字符以%为前缀,其后用十六进制表示每个字节。
攻击Web应用程序时之所以要用到Unicode编码,主要在于有时可用它来破坏输入确认机制。如果输入过滤组织了某些恶意表达式,但随后处理输入的组件识别Unicode 编码,就可以使用各种标准与畸形Unicode编码避开过滤。
HTML编码
HTML编码是一种用于表示问题字符以将其安全并入HTML文档的方案。有许多字符具有特殊的含义,并被用于定义文档结构而非其内容。为了安全使用这些字符并将其用在文档内容中,就必须对其进行HTML编码。
此外,任何字符都可以使用它的十进制ACII码进行HTML编码,或者使用十六进制的ASCII码。
当攻击Web应用程序时,HTML编码主要在探查跨站点脚本漏洞时发挥作用。如果应用程序在响应中返回未被修改的用户数据,那么它可能易于受到攻击;但是,如果它对危险字符进行HTML编码,也许比较安全。
Base64编码
Base64编码仅用一个可打印的ASCII字符就可安全转换任何二进制数据,它常用于对电子邮件附件进行编码,使其通过SMTP安全传输。它还可用于在基本HTTP验证机制中对用户整数进行编码。
Base64编码将输入数据转换成3个字节块。每个块被划分为4端,每段6个数据位。这6个数据位有64种不同的排列,因此每个段可使用一组64个字符标识。Base64、使用以下字符集,其中只包含可打印的ASCII字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
如果最后的输入数据块不能构成3段数据输出,就用一个或者两个等号(=)补足输出。
十六进制编码
许多应用程序在传送二进制数据时直接使用十六进制编码,用ASCII字符表示十六进制数据块。