WebGoat第一关:Http Splitting与Cache Poison

课余时间实在无聊,魔兽又不开MOP,下了个WEBSCAREB同时又下了个WEBGOAT玩,发现还不错,即算是开拓思路,同时在自己做WEB开发的时候可以少犯错误,还能学点黑客技术去黑黑别人的网站什么的。

 

本来不想写这篇博客的,轻易能在网上找到的东西写下来意义不大,但是闲着也是闲着,全当做个笔记一段时间之后再看或许也会别有一番风味。

 

WebGoat的下载安装,以及其相应工具比如WebScareb的安装不再多说,从网上找到了这两个开源项目的网站,下载安装即可。

WebGoat:https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project

WebScareb:https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project

 

要使WebScareb能截取到浏览器的http请求,需要设置浏览器的代理为localhost:8008,其中8008是WebScareb的默认端口。设置好了之后就能截取http请求和响应了。

 

1、攻击效果与目标

该攻击的作用会使用户接收不到正确的服务器回发的信息,而是接收的错误的经过伪装的信息,比如挂了马的网页、含有垃圾信息的网页等。采用了攻击缓存服务器的方法,所以并不是针对http服务器的攻击而是针对具体用户的攻击。

 

2、攻击原理

HTTP请求是基于请求---响应的请求,当浏览器发出请求,HTTP服务器返回响应,浏览器根据响应再发出请求,依次类推。但需要知道的是,响应的返回通常是基于队列的形式,像这样:

 

但是有一种特殊的响应,叫重定位相应,3xx,浏览器收到这个响应的时候,会重新向服务器发送get或者post请求去请求一个新的网页,比如这个响应:

可以看出,服务器告诉浏览器,这个网页暂时的被移动位置了(moved temporarily),如果你要访问,就去location这个地址找。注意这个地址,language是我在前一个网页中传入的值(前一个网页其实是搜索网页),换句话说,我在前一个网页传入的值作为一个响应被服务器回传回来了,而且因为这是个302响应,所以浏览器肯定还会接着发出一个请求,根据这一点我们就可以构造特殊的url值来欺骗过缓存,达到我们想要的效果。

url编码中,%0d和%0a分别代表回到行首和换行,加起来就是回车的作用。而在http响应中,如果某行的内容是content-length:0,则响应队列会认为这个响应已经结束,会把这个响应发出去,而把后面的内容当做是新的一个响应。因此,我们构造如下字符串作为查询的内容:

china%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2047%0d%0a%0d%0a<html>Insert undesireable content here</html>

然后可以看到回传的302响应变成了:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost/WebGoat/attack?Screen=2&menu=100&fromRedirect=yes&language=china%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2047%0d%0a%0d%0a<html>Insert undesireable content here</html>
Content-Type: text/html;charset=ISO-8859-1
Content-length: 0
Date: Tue, 28 Aug 2012 13:02:51 GMT

非常的不直观,url解码一下可以看到变成了:

当响应队列读取到第一个content-length:0的时候,会认为这个响应已经结束接着向浏览器发出,而把之后的内容留在了响应队列里。而后面的内容是我们精心构造的内容,正好又形成了另外一个响应,当浏览器根据重定向的地址请求访问的时候,后面这个响应正好发出,而这个响应是含有我们构造的恶意代码的,所以傻傻的浏览器果断中枪,显示了我们注入的不正确的内容。

值得注意的是,你不光欺骗了浏览器,同时欺骗的是缓存,换句话说,让缓存错误的认为,给定特定的那个url,返回的内容就是你注入的代码。所以,在短时间内如果别人也恰好访问了这个url,而且你们公用同一个缓存的情况下,呵呵呵,呵呵呵呵呵呵呵呵呵。
 
当然,在这个基础上,我们可以改进我们的攻击方式让它更有威胁,比如在构造的http 200请求中加入Last-modify字段,并设置一个将来的值比如2020年1月1日。意思是服务器告诉浏览器,这个网页最后一次修改在2020年1月1日的时候。然后如果浏览器不清除缓存,下一次仍然请求这个页面的时候,它会加上if-modify-since字段,并且值是2020年1月1日,也就是说浏览器会问服务器,这个网页在2020年1月1日之后修改过嘛?
当然服务器是人的话肯定会对这个问法莫名其妙,怎么会传过来一个未来的值?但是因为是程序,服务器会比对最后一次修改时间和传过来的时间,发现传过来的时间较新(都是未来了,肯定新),就会回发304响应,即not modify,表示这个网页没有被修改过。浏览器接受到了这个响应会从本地缓存读取网页,当然是我们之前注入的错误网页。换句话说,如果浏览器不清除缓存,再也别想读取到正确的网页信息了。
 
值得注意的是,虽然全文都说的是“浏览器”,可是如果一个HTTP代理服务器在服务器眼里看来不也是个“浏览器”么。

你可能感兴趣的:(浏览器,cache,服务器,HTTP服务器,url,缓存服务器)