建议大家把公众号“鹏组安全”设为星标,否则可能就看不到啦!因为公众号现在只对常读和星标的公众号才能展示大图推送。操作方法:点击右上角的【...】,然后点击【设为星标】即可。
漏洞说明
漏洞描述
为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。例如,在php里用_SERVER[“HTTP_HOST”]。但是这个header是不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。
危险等级
中危
修复建议
web 应用程序应该使用 SERVER_NAME 而不是 host header。在 Apache 和 Nginx 里可以通过设置一个虚拟机来记录所有的非法 host header。在 Nginx 里还可以通过指定一个 SERVER_NAME 名单,Apache 也可以通过指定一个 SERVER_NAME 名单并开启UseCanonicalName 选项。
下图为绿盟扫描器的报告截图:
漏洞复现
可以使用 curl 或 BurpSuite 工具修改 Host 请求头,复现测试
curl测试方法
curl -h
-I, --head Show document info only
-H, --header <header/@file> Pass custom header(s) to server
-v, --verbose Make the operation more talkative
curl -v -H "Host: www.baidu.com" http://192.168.64.149
测试结果:任意修改 Host 请求头,服务器都能返回 302 Found
BurpSuite测试方法
开启代理抓包后,Send to Repeater点击 Send 重复发送当前包,下面是未修改的正确 Host 请求头,及其返回状态码:200 OK
任意修改 Host 请求头,再发送数据包,观察返回状态码。可以看到都能返回:200 OK,即正常请求到 web 页面
漏洞修复
漏洞修复方案
修改 nginx.conf 配置,设置 server_name,添加正则表达式匹配 host 请求头的值,不匹配情况返回403。
# server_name localhost;
#### http_Host fix
server_name 127.0.0.1 192.168.64.149;
if ($http_Host !~* ^127.0.0.1$|^192.168.64.149$) {
return 403;
}
## 语义解析:
## ! 非
## ~ 匹配正则
## * 任意
## ^ 匹配开头字符
## & 匹配末尾字符
## | 或
## 首先指定server_name字段值;
## 如果变量$http_Host不是(127.0.0.1或192.168.64.149),if判断成立,执行后面的内容,即返回403跳转页面;
## 如果变量$http_Host是(127.0.0.1或192.168.64.149),if判断不成立,则不执行后面的内容。
## 建议查阅nginx官方文档:https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name
重启 nginx
nginx -s reload
漏洞修复验证
当 Host 请求头正确匹配 server_name(127.0.0.1或者192.168.64.149)时,服务器返回了 302 Found;其他任意 Host 请求头未匹配 server_name 的情况下,服务器都返回 403 Forbidden。
-
curl 测试结果
-
BurpSuite 测试结果
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
原文始发于微信公众号(鹏组安全):目标URL存在http_host头攻击漏洞复现及修复
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论