课余时间实在无聊,魔兽又不开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的时候,会认为这个响应已经结束接着向浏览器发出,而把之后的内容留在了响应队列里。而后面的内容是我们精心构造的内容,正好又形成了另外一个响应,当浏览器根据重定向的地址请求访问的时候,后面这个响应正好发出,而这个响应是含有我们构造的恶意代码的,所以傻傻的浏览器果断中枪,显示了我们注入的不正确的内容。