web安全/渗透测试--20--HTTP Host头攻击

版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途。 https://blog.csdn.net/wutianxu123/article/details/82718368

1、漏洞描述

一般通用web程序是如果想知道网站域名不是一件简单的事情,如果用一个固定的URI来作为域名会有各种麻烦。开发人员一般是依赖HTTP Host header(比如在php里是_SERVER["HTTP_HOST"] ),而这个header很多情况下是靠不住的。而很多应用是直接把这个值不做html编码便输出到了页面中,比如:

<link href=http://_SERVER["HTTP_HOST"]></link>    //触发一个get请求
<form method=”POST”></form>                       //触发POST请求

这样处理问题一般会很容易遭遇到两种常见的攻击:缓存污染和密码重置。缓存污染是指攻击者通过控制一个缓存系统来将一个恶意站点的页面返回给用户。密码重置这种攻击主要是因为发送给用户的内容是可以污染的,也就是说可以间接的劫持邮件发送内容。

2、检测条件

1、被测网站使用了依赖HTTP Host header的功能
2、网站具有密码重置,发送邮件功能

3、检测方法

检测方法可以根据上述两种方式:

1、密码重置污染攻击,点击重置密码的链接时,url::abs_site这一部分使用的Host header是来自用户重置密码的请求,那么可以通过一个受他控制的链接来污染密码重置的邮件,例如替换host:当然这种攻击方式一定要能骗取用户点击访问这个受污染的链接,如果用户警觉了没有点击,那么攻击就会失败

> POST /password/reset HTTP/1.1
> Host: evil.com
> ...
> csrf=1e8d5c9bceb16667b1b330cc5fd48663&name=admin

2、通过Host header来污染缓存的攻击方法:

因此为了能使缓存能将污染后的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

3、修改参数:

http://example.com/?mode=guest&search=kittens&num=100      
//正常请求

http://example.com/?mode=guest&search=kittens&num=100&search=dogs&num=1200            
//附加多余参数,注意参数名不变,数量增加,参数数值改变。如果响应返回内容与正常请求的返回内容不同,则可能触发参数污染漏洞。

4、利用web漏洞扫描工具进行检测

4、修复方案

1、服务器方面:

由于http请求的特点,host header的值其实是不可信的。唯一可信的只有SERVER_NAME,这个在Apache和Nginx里可以通过设置一个虚拟机来记录所有的非法host header。在Nginx里还可以通过指定一个SERVER_NAME名单,Apache也可以通过指定一个SERVER_NAME名单并开启UseCanonicalName选项。建议两种方法同时使用。

Varnish很快会发布一个补丁。在官方补丁出来前,可以通过在配置文件里加入:

import std;
sub vcl_recv {
    std.collect(req.http.host);
}

2.应用方面:

解决这个问题其实是很困难的,因为没有完全自动化的方法来帮助客户识别哪些host的值是值得信任的。虽然做起来有点麻烦,但是最安全的做法是:在网站安装和初始化的时候,要求管理员提供一个可信任的域名白名单。如果这个实现起来比较困难,那至少也要保证使用SERVER_NAME而不是host header,也就是取得HOST值并保存设为常量并且鼓励用户使用安全配置做的比较好的站点。

猜你喜欢

转载自blog.csdn.net/wutianxu123/article/details/82718368