阅读:3476回复:0
利用HTTP host头攻击的技术
from:http://www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html
◆0 背景 一般通用web程序是如果想知道网站域名不是一件简单的事情,如果用一个固定的URI来作为域名会有各种麻烦。开发人员一般是依赖HTTP Host header(比如在php里是_SERVER["HTTP_HOST"] ),而这个header很多情况下是靠不住的。而很多应用是直接把这个值不做html编码便输出到了页面中,比如: hash = random::hash() ; $message -> confirm_url = url::abs_site("password/do_reset?key=$user->hash") ; 当用户点击重置密码的链接时,肯定可以说明点的是自己的账户。 图片:2014091811183018026.png 这个地方的漏洞是: url::abs_site 这一部分使用的Host header是来自用户重置密码的请求,那么攻击者可以通过一个受他控制的链接来污染密码重置的邮件。 > POST /password/reset HTTP/1.1 > Host: evil.com > ... > csrf=1e8d5c9bceb16667b1b330cc5fd48663&name=admin 这个漏洞在Django,Piwik 和Joomla中都存在,还有一些其他的应用,框架和类库。 当然这种攻击方式一定要能骗取用户点击访问这个受污染的链接,如果用户警觉了没有点击,那么攻击就会失败。当然你自己也可以配合一些社会工程学的方法来保证攻击的成功率。 还有一些情况,Host可能会被url编码后直接放到email的header里面造成header注入。通过这个,攻击者可以很容易的就能劫持用户的账户。 ◆2 缓存污染 通过Host header来污染缓存的攻击方法最初是Carlos Beuno 在2008年提出来的。但是在现在的网络架构中,这种攻击还是比较困难的,因为现在的缓存设备都能够识别Host。比如对于下面的这两种情况他们绝对不会弄混淆: > GET /index.html HTTP/1.1 > GET /index.html HTTP/1.1 > Host: example.com > Host: evil.com 因此为了能使缓存能将污染后的response返回给用户,我们还必须让缓存服务器看到的host header 和应用看到的host header 不一样。比如说对于Varnish(一个很有名的缓存服务软件),可以使用一个复制的Host header。Varnish是通过最先到达的请求的host header来辨别host的,而Apache则是看所有请求的host,Nginx则只是看最后一个请求的host。这就意味着你可以通过下面这个请求来欺骗Varnish达到污染的目的: > GET / HTTP/1.1 > Host: example.com > Host: evil.com 应用本身的缓存也可能受到污染。比如Joomla就将取得的host值不经html编码便写进任意页面,而它的缓存则对这些没有任何处理。比如可以通过下面的请求来写入一个存储型的xss: curl -H "Host: cow"onerror='alert(1)'rel='stylesheet'" http://example.com/ | fgrep cow" 实际上的请求是这样的: > GET / HTTP/1.1 > Host: cow"onerror='alert(1)'rel='stylesheet' 响应其实已经受到污染: |
|