Http拆分
HTTP Spliting(拆分)
HTTP Spliting攻击讲解
之所以会出现http拆分是因为客户端和服务器端每一次交互的结束标志、存在重定向和对于服务器端响应的消息在客户端是以消息队列的方式存在的。当客户端向服务器发出一个请求的时候,有时候这个请求要求服务器给我们重定向到其他的地址,这是服务器会返回给客户端一个302的重定向信息,并以Location标签给出重定向之后的访问地址,客户端收到服务器端的重定向数据后会向Location所指的地址发送访问请求。
在http响应中,浏览器会根据content-length:0向下寻找到换行为止作为一个响应的结束,然后将所有的响应以消息队列的形式存起来。如果我们可以构造特殊的参数使得浏览器收到重定向消息的时候,将收到的一个响应当做两个响应,那么我们的第二个响应就会被存入消息响应队列中,接着浏览器就会根据Location的地址,进行重定向的请求,这时候由于我们构造的第二个响应已经存在于消息队列,则浏览器会直接把它拿来当做我们重定向请求后得到的响应。这样我们就可以用自己构造的页面替代用户访问的页面,进而施行钓鱼攻击等。
如表1所示的内容,浏览器在收到服务器端的响应之后首先根据Content-length: 0 加换行将消息分为两个响应并加入消息队列,其次取出第一个响应的消息发现是一个302的重定向,则会向Location的地址发送请求,这是浏览器检测到自己的消息队列中由内容存在,也就是我们第一次请求得到的第二个响应消息,它会直接把这个响应消息当做重定向请求得到的响应。(在下面我们以不同颜色标出了两次响应消息)
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost/WebGoat/attack?Screen=3&menu=100&fromRedirect=yes&language=hahaha
Content-Type: text/html;charset=ISO-8859-1
Content-length: 0
HTTP/1.1 200 OK
Content-tpye:Content-Type: text/html;charset=ISO-8859-1
Content-length:19
<html>hacked</html>
Date: Sat, 02 Jan 2016 11:12:55 GMT
X-RevealHidden: possibly modified