关于网站的渗透测试可能师傅们都有自己一套思路,有个共同点就是目标网站基本属于全静态页面,几乎很少存在动态参数这时意味着客户端无法通过提交参数形式进行测试,理论上也规避掉了许多风险。既然无法从参数层面进行测试,那么考虑尝试下修改header中的值看看是否被服务端允许,比如HOST值
一 HOST标头概念
host标头作为Request Header中不可或缺的一部分,大家知道http版本从开始的1.0到1.1以及以后的1.2经历三个版本,且目前1.1用户最多。在1.0中Request Header中的host值其实可以为空,和1.1区别主要是1.1支持不间断连接、1.0则每次得到响应后断开连接。另外1.0不支持虚拟主机只能一个ip对应一台服务器,这也是1.0中host可以为空的主要原因。
Host被解析的大致流程如下:
客户端-->请求-->URL-->解析IP地址-->服务器-->解析Host值-->转发具体域名
在1.1中host标头的主要功能将客户端请求分发到内部具体的域名中,当然如果存在ng反代或负载等情况下当流量到达服务器之前可能会更改host的值。如果1.1中不包含host的值或值格式有误服务器则返回400或其他错误,下图以某官网为例
(上图携带host值)
(上图host值为空)
在基于目标存在虚拟主机(同IP不同域名)情况下,url负责解析IP,服务器接收到请求时依据host值负责分发到具体域名中。
二 漏洞产生及危害
服务器充分信任客户端所提交的数据或管理员没有意识到host可能产生的风险,比如服务器支持X-Forwarded-Host标头(XFH),X-Host等。在修改原始Host值或者通过添加XFH标头将值设置其它域还能被服务器正常接受,就判断可能存在Host注入了..
下图通过修改某官网host值,服务器返回404找不到路径..
下图删除或修改百度的host值看有什么反应
当删除百度Host值依然返回200OK,如果修改的话直接返回403,因此判断服务器后端有默认配置www.baidu.com,host值为空时则采用默认配置;当修改值时因为依然存在值会直接解析该值所以不会重定向到www.baidu.com,由于无法解析2222因此返回403。
了解host基本工作原理后,那么存在host漏洞会造成哪些影响?理论上造成的影响其实有很多比如越权,SSRF,SQL注入,XSS等等。。
下面利用burp场景介绍基于host注入造成的垂直越权,正常请求如下
当访问管理页面时出现未授权访问
当将host值修改为localhost时访问成功
具体漏洞利用场景有很多,这里不一一赘述,对host注入感兴趣的朋友可以私信交流。
三 如何探测host注入
1.探测网址url是否包含host注入漏洞很简单,尝试修改或删除host值后观察服务器响应,如果修改后或完全删除还能够被服务器接收并返回响应基本判断存在注入,当然具体还要推测服务器后端具体配置。
2.通过探测网站支持的标头来测试,如X-Host,X-Forwarde-Host等,这里推荐一款老外写的自动化主机头检测工具在burpsuite中直接安装下载 Param Miner,使用方法很简单
安装成功后在站点地图中右键使用
在Extender中Extensions中查看
四 如何规避Host注入
1.在后端配置文件中结合业务情况禁用绝对路径的url,采用相对路径如/wp-admin/a.php
2.如必须绝对路径,应手动添加绝对路径并指定域名如https://a.baidu.com/wp-admin/a.php,在配置文件中引用此值,而不是host值
3.在web框架中以白名单方式验证,只允许允许的域
4.禁用不需要的标头如XFH,XH等,一些中间件默认可能支持XFH标头
感谢阅读,不足之处欢迎大佬斧正~