对实验步骤中的每个步骤进行截图解释说明为什么这样做,最后结合截图总结http response splitting和web cache poisoning的基本实现方法
HTTP response splitting:
http响应头截断攻击重点在于可以在http头中输入数据,构造特殊字符形成截断。以下是根据用户提交的值进行的重定向目标URL。(这里需要注意的是 构建此畸形数据的时候要符合HTTP请求和响应的包格式。比如HTTP请求和响应都需要用CRLF(即%0d%0a)来隔开数据包的header和body。)
这样我们就可以构造特殊的字符来拆分HTTP头,并到其后追加一个自己构造的头。经过URLencoding以后参数如下
得到如下:
从以上可以看到的是:输入的参数已经提交到HTTP头中,然后刷新,
http响应头截断攻击重点在于可以在http头中输入数据,构造特殊字符形成截断。 造成http响应头截断漏洞的主要原因是对用户提交的非法字符没有进行严格的过滤,尤其是CR,LF字符的输入。攻击者通过发送一经过精心构造的request,迫使服务器认为其返回的数据是两个响应,而不是常规的一个响应(即请求重定向)。
Web cache poisoning:
污染缓存,为了做到这一点,我们需要在前面提交的参数中,自己伪造的HTTP响应头中添加一个Last-Modified字段,并且把它的值设为一个未来的值。这样当浏览器在下次请求同一个页面的时候发送If-Modified-Since字段并且这个值是一个未来的值,服务器在发现这个值大于该页面最后修改时间之后将返回HTTP的304响应码表示该页面没有更新过,从而达到了污染受害者缓存的目的(即这个页面缓存会一直存在直到过期且不会更新)。
什么是”Last-Modified”?
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。