九零登录

[【通过】] 利用Host header attack进行社交工程攻击手法

[复制链接]
发表于 2016-9-5 09:12:29 | 显示全部楼层 |阅读模式
一、先总结一下攻击方式:
在重设忘记密码的HTTP请求中,攻击者可以透过修改header中的Host或 X-Forwarded-Host字段为自己设定的domain,使得网站送email给受害者的重设密码链接为自己的自制URL。
透过这手法,攻击者也就可以透过官方核发的email,欺骗收信者点击URL而外泄重设密码token或是导向恶意网站。

二、拿对岸的网站以方便实作:
1.至重设密码网页,输入存在的email,并且按下送出
1.jpg
2.抓包后,修改Host为www.baidu.com
2.jpg
3.jpg
3.收到信后,发现连结确实被成功修改
4.jpg


三、说明:
1.     研究源码时,想到密码重设链接制作过程中,因为使用者email收信时与送出的网站没有关联,如果domain不写成hard code,势必要有方式取得重设密码链接的domain,也就使得很多网站开发者误用客户端可以控制的$_SERVER['HTTP_HOST']。
因此攻击者只要在重设密码链接时,修改Host header就可以成功修改email的连结。
2.     虽说近年来,工程师资安意识抬头应该会避免使用$_SERVER['HTTP_HOST'],而使用$_SERVER['SERVER_NAME'],但是在测试的网站中,却依然常常看见,让我百思不解。
3.     继续追查下去,发现在apache 2以上,预设$_SERVER_NAME竟然会取自$_HTTP_HOST ?!,如同国外文章https://bz.apache.org/bugzilla/show_bug.cgi?id=49347 ,经过自己架设实作环境后,验证确实如此,也就不难说明为什么这漏洞依然存在许多网站。

(1)自行撰写一个网页http://hha.com.tw/hostheader.php进行测试


5.jpg
(2)送出http://hha.com.tw/hostheader.php并且修改hostheader为evil.com.tw,发现网站确实依然会使用hostheader的信息! (Apache2.2.21)
6.jpg


4.经过实测其他网站后,最后结论发现只要是Nginx和Apache网站,几乎都可以透过Host或是 X-Forwarded-Host而成功修改连结,或许是与各种webserver预设设定有相关



发表于 2016-9-5 14:16:10 | 显示全部楼层
攻击者可以透过修改header中的Host或 X-Forwarded-Host字段为自己设定的domain,使得网站送email给受害者的重设密码链接为自己的自制URL。


按照你说的修改HOST,看了你的图,能成功真是玄学。

你这个操作是POST方式的,POST方式,非常简单,分为两点↓
1.提交地址
1-1.burp中分为HOST(请求主机头)
1-2.burp中第一行分为提交文件

2.提交数据

如果我把HOST改了,目标都接收不到,谈何攻击,除非你这个http访问没经过HOST,不过这根本不可能。

或者就是我理解有问题,不过改HOST我觉得不可能实现攻击。

@allensmile
希望楼主有空答复下

发表于 2016-9-5 15:23:28 | 显示全部楼层
我没看懂。
除非把host文件给修改掉,对应的Ip改为目的ip。
发表于 2016-9-5 16:44:02 | 显示全部楼层
挺赞的思路。
 楼主| 发表于 2016-9-5 17:17:16 | 显示全部楼层
HTTP的联机是TCP/IP时建立的,与Header中的HOST字段是没有关系的…所以修改HOST header并不会丢给另外一台主机…。

举例来说:
于浏览器上的www.123.com按下送出,dns会解析成 33.3.3.3,然后client会与33.3.3.3那台主机进行TCP handshake。然后在application laye的进行HTTP request和response。
而这边修改HTTP header还是与33.3.3.3进行通讯,只是喂给web server不同得host header。
简单来说,host header是host header,与实际上连向的IP是没有的,这边您可能误解了。

至于为什么会有Host header的由来,是因为virtual host原因,同个IP上面架上不同domain时,就需要使用host header来分辨交给哪个后头的virtual host进行处理。

评分

参与人数 1酒票 +1 收起 理由
管理05 + 1 积极参与讨论

查看全部评分

发表于 2016-9-5 19:24:12 | 显示全部楼层
本帖最后由 hundan 于 2016-9-5 19:30 编辑

的确跟数据包内的host没什么关系,这点我也是以前在360出的视频里看到的一个exp才了解的。

正如我们有这样的经验,在使用burp新建发包时,除了填写数据包之后,点发送时会提醒还需要填写主机名和端口。

我们也有这样的经验:在使用NC时,即使有数据包,依然让我们填写host。

而例如php之类的,其内置函数大概是直接获取数据包里的host作为主机,使得其简化了代码。

同样是host部分的问题,我记得以前360一个团队出过一个自动化代码审计,出的一个exp就是在host注入。

最后,楼主的帖子真是让人耳目一新。

评分

参与人数 1酒票 +1 收起 理由
管理05 + 1 积极参与讨论

查看全部评分

发表于 2016-9-5 19:36:04 | 显示全部楼层
可以可以,很棒。谢谢表哥们了。
发表于 2016-9-5 23:31:54 | 显示全部楼层
假如这个服务器有2个网站   就有可能发生2楼说的话     这个可能大于80%
 楼主| 发表于 2016-9-6 09:03:53 | 显示全部楼层
回一下楼上,
其实不一定,如果网站是virtual host,也就是同个IP多台主机,网站默认或是配置文件中会有一个判断。当host field不为在设定里头,会是交由设定中第一个网站的程序去进行处理,可参考apache说明
https://httpd.apache.org/docs/2.4/vhosts/examples.html
也就是如果$_SERVER['HTTP_HOST']是写在第一个网站的程序处理,还是一样会有问题。

<VirtualHost www.a.com:80>
    DocumentRoot "/www/example1"
    ServerName www.example.com

    # Other directives here
</VirtualHost>

<VirtualHost www.b.com:80>
    DocumentRoot "/www/example2"
    ServerName www.example.org

    # Other directives here
</VirtualHost>

发表于 2016-9-7 10:18:41 | 显示全部楼层
本帖最后由 outman 于 2016-9-7 10:53 编辑

不错的思路大赞  http://www.2cto.com/Article/201404/292132.html

九零

GMT+8, 2026-10-22 14:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表