一、Host头的用途
Host头的主要作用是将客户端的请求转发给指定的服务器,同时允许在同一台服务器上为多个域名提供服务。
- 虚拟主机技术:在HTTP1.1协议中,Host头用于实现虚拟主机技术。该技术允许在一台服务器上运行多个网站或服务,每个网络都有自己的域名,共享同一台服务器的IP地址。这样,用户只需要通过访问特定的域名来访问不同的网站,而不需要知道它们实际上是在同一台服务器上运行的。
- 请求路由:当客户端(例如浏览器)向服务器发送一个HTTP请求时,它可以通过Host头指定目标Web服务器的名称。这有助于服务器根据请求的域名找到正确的后端资源进行处理,即使这些资源可能位于不同的服务器上。
二、http_host头漏洞产生的原因
企业为了节约资源会将多个应用程序部署在同一个ip上,并通过Host头来区分用户欲请求的应用程序。为了方便获得欲请求网站的域名,开发人员直接使用HTTP Host header。但是,如果应用程序没有对host header值进行处理,那么就极可能造成恶意代码的传入。
在php里使用的是$_SERVER[“HTTP_HOST”]。$_SERVER[“HTTP_HOST”] 是 PHP 中的一个超全局变量,用于获取当前请求的域名。当一个 HTTP 请求到达服务器时,服务器会接收到一个请求头,其中包含了许多关于请求的信息,包括请求的域名。$_SERVER[“HTTP_HOST”] 就是这个请求头中的域名信息。例如,如果一个请求的URL 是http://www.example.com/page.php,那么 $_SERVER[“HTTP_HOST”] 的值就会是 www.example.com。需要注意的是,$_SERVER[“HTTP_HOST”] 的值是由客户端提供的,因此可能存在安全风险。
三、漏洞检测方法
1.curl测试方法
curl -v -H "Host:www.baidu.com" http://192.168.64.1
测试结果:任意修改Host请求头,服务器都能返回 302 Found。
2.BurpSuite测试方法
- 开启代理抓包后,send to repeater。
- 点击send发送当前包,使用未修改的正确的Host请求头,返回状态码 200 OK;修改任意Host请求头,再发送数据包,返回状态码 200 OK,即正常请求到 web 页面。
四、漏洞利用
1.资源访问控制绕过:攻击者可以伪造Host头来绕过服务器访问控制策略。服务器配置了特定的访问控制规则,仅允许特定主机或域名访问敏感资源,攻击者通过伪造Host头,使服务器误以为请求来自信任的主机,从而绕过访问控制。
2.跨站请求伪造(CSRF):攻击者可以伪造Host头来欺骗用户浏览器发送恶意请求,以用户的名义执行未经授权的操作。
3.服务器端缓存污染:攻击者可以伪造Host头来污染服务器端的缓存。如果服务器根据Host标头字段来缓存响应内容,攻击者可以伪造Host标头发送恶意请求,将恶意响应缓存到服务器上,从而导致其他用户受到影响。
相关漏洞利用实验关注微信公众号【秋风有意染黄花】”发送数字 7”(Web缓存中毒实验)”发送数字 8“(Host头身份认证绕过实验)”发送数字 9“(基于路由的SSRF攻击实验)可获取实验工具及操作步骤。
五、漏洞修复验证
1.使用curl测试,当 Host 请求头正确匹配 server_name(根据实际情况确定)时,服务器都返回了302 Found;其他任意Host请求头未匹配 server_name的情况下,服务器都返回 403 Forbidden。
2.使用Burpsuit测试,当Host请求头正确匹配时,返回状态码 200 OK;其他任意Host请求头,返回状态码 403 Forbidden。
如有不解,可以留言讨论(欢迎关注公众号**【秋风有意染黄花】**不定期发布技术文章)。
免责声明
我们本着技术分享的原则,分享学习心得和工具掌握,请勿将其用于任何非授权的行为,请严格遵守国家信息安全法。若是有违规的地方,请联系删除。