1.2
HTTP响应

如图1.6所示,下面是一个典型的HTTP响应。

图1.6 HTTP响应

其对应的代码如下。

可以看出,每个HTTP响应的第一行由3个以空格间隔的项目组成。上面的代码代表的是服务器响应返回代码,响应完以后,就可以看到网站的状态。

●HTTP/1.1表示使用的HTTP版本。

●200表示请求结果的数字状态码。200是最常用的状态码,它表示成功提交了请求,正在返回所请求的资源。

●一段文本形式的“原因短语”OK,进一步说明响应状态。这个短语中可以包含任何值,当前浏览器不将其用于任何目的。

响应示例中的其他要点如下。

●Server:消息头中包含一个旗标,指明所使用的Web服务器软件。有时还包括其他信息,如所安装的模块和服务器操作系统。其中包含的信息可能并不准确。

●Set-Cookie:消息头向浏览器发送另一个Cookie,它将在随后向服务器发送的请求中由Cookie消息头返回。

●Pragma:消息头指示浏览器不要将响应保存在缓存中。

●Expires:消息头指出响应内容已经过期,因此不应保存在缓存中。当返回动态内容时常常会发送这些指令,以确保浏览器随时获得最新内容。

●几乎所有的HTTP响应在消息头后的空白行下面都包含消息主体。

●Content-Type:消息头表示这个消息主体中包含一个HTML文档。

●Content-Length:消息头规定消息主体的字节长度。

为了让大家了解GET和POST操作,我们还需要利用火狐浏览器来进行操作,如图1.7所示。

图1.7 HTTP Header Live插件

刷新页面以后可以看到工具栏出现大量URL网址,每个网址头前面显示GET或是POST方式。图1.8所示为GET方式显示。

图1.8 GET请求

图1.9所示为POST方式显示。

图1.9 POST请求

除了GET和POST方法以外,HTTP协议还支持许多其他因特殊目的而建立的方法,具体如下。

●HEAD。这个方法的功能与GET方法相似,不同之处在于服务器不会在其响应中返回消息主体。服务器返回的消息头应与对应GET请求返回的消息头相同。因此,这种方法可用于检查某一资源在向其提交GET请求前是否存在。

●TRACE。这种方法主要用于诊断。服务器应在响应主体中返回其收到的请求消息的具体内容。这种方法可用于检测客户端与服务器之间是否存在任何操纵请求的代理服务器。

●OPTIONS。这种方法要求服务器报告对某一特殊资源有效的HTTP方法。服务器通常返回一个包含Allow消息头的响应,并在其中列出所有有效的方法。

●PUT。这个方法试图使用包含在请求主体中的内容,向服务器上传指定的资源。如果激活这个方法,渗透测试员就可以利用它来攻击应用程序。例如,通过上传任意一段脚本并在服务器上执行该脚本来攻击应用程序。

还有许多其他与攻击Web应用程序没有直接关系的HTTP方法。然而,如果激活某些危险的方法,Web服务器就可能面临被攻击的风险。

1.2.1
HTTP消息头

HTTP支持许多不同的消息头,其中一些用于特殊用途。一些消息头可用在请求与响应中,而其他一些消息头只能专门用在某个特定的消息中。下面列出Web应用程序时可能遇到的消息头。

1.请求消息头

请求类消息头如图1.10所示。

图1.10 HTTP请求消息头

●Host:用来告知服务器,请求的资源所处的互联网主机名和端口号。

●User-Agent:这个消息头提供与浏览器或生成请求的其他客户端软件有关的信息。

●Accept:这个消息头用于告诉服务器,客户端愿意接受哪些内容,如图像类型、办公文档格式等。

●Accept-Language:是一个实体消息首部,用来说明访问者希望采用的语言或者是语言的组合。

●Accept-Encoding:这个消息头用于告诉服务器,客户端愿意接受哪些内容编码。

●Content-Type:表示具体请求中的媒体类型信息,确切地说是客户端告知服务端,自己即将发送的请求消息携带的数据结构类型,好让服务端接收后以合适的方式处理。

●Content-Length:用于描述HTTP消息实体的传输长度。

●Origin:这个消息头用在跨域Ajax请求中,用于指示提出请求的域。

●Referer:这个消息头用于指示提出当前请求的原始URL。

●Cookie:这个消息头用于向服务器提交它以前发布的Cookie。

2.响应消息头

响应类消息头如图1.11所示。

图1.11 HTTP响应消息头

●Content-Type:返回内容的MIME类型。

●Date:原始服务器消息发出的时间。

●Server:这个消息头提供所使用的Web服务器软件的相关信息。

●Set-Cookie:这个消息头用于向浏览器发布Cookie,浏览器会在随后的请求中将其返回给服务器。

●Transfer-Encoding:文件传输编码。

●Vary:告诉下游代理是使用缓存响应还是从原始服务器请求。

●X-Frame-Options:这个消息头指示浏览器框架是否以及如何加载当前响应。

1.2.2
Cookie

Cookie是大多数Web应用程序所依赖的HTTP协议的一个关键组成部分,攻击者常常通过它来利用Web应用程序中的漏洞。服务器使用Cookie机制向客户端发送数据,客户端保存Cookie并将其返回给服务器。与其他类型的请求参数(存在于URL查询字符串或消息主体中)不同,无需应用程序或用户采取任何特殊措施。随后的每一个请求都会继续重新向服务器提交Cookie,如前文所述,服务器使用Set-Cookie响应消息头发布Cookie。

●Set-Cookie:tracking=tI8rk7joMx44S2Uu85nSWc

然后,用户的浏览器自动将下面的消息头,添加到随后返回给同一服务器的请求中。

●Cookie:tracking=tI8rk7joMx44S2Uu85nSWc

如上所示,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。

上述每一个Cookie属性都可能影响应用程序的安全,其造成的主要不利影响在于攻击者能够直接对应用程序的其他用户发动攻击。具体请参阅后面实战部分。