springboot检测到目标url存在http host头攻击漏洞
上周三凌晨两点,检测我盯着屏幕上的到目Burp Suite扫描报告,一行红字扎眼得很:“HTTP Host Header Attack”。攻击目标是漏洞个刚上线的Spring Boot电商后台,用的检测还是默认的Tomcat 9.0.45。当时第一反应是到目——这玩意儿不是老掉牙的漏洞吗?结果复现的时候,还真让我后背发凉。攻击
漏洞触发点简单得离谱。漏洞系统里有个“找回密码”接口,检测用户提交邮箱后,到目后端生成重置链接,攻击链接的漏洞域名部分直接取了request.getHeader("Host")。我随手用curl把Host头改成evil.com,检测收到的到目邮件里重置链接就变成了http://evil.com/reset?token=xxx。攻击者只要在公共WiFi下抓个包,攻击把Host一改,用户点进去,token就直接送到攻击者服务器上了。
Spring Boot为什么容易踩这个坑
Spring Boot默认内嵌Tomcat,而Tomcat从某个版本开始,对Host头的校验其实做了限制——但仅限于server.tomcat.remote-ip-header和server.tomcat.protocol-header这些配置开启的时候。大部分项目压根没动过这些参数,Tomcat就默认信任任何Host头。更麻烦的是,Spring MVC里@RequestMapping拿到请求后,ServletUriComponentsBuilder.fromRequestUri(request)这类工具方法会直接拼接Host,开发者根本意识不到自己写的代码已经埋了雷。
我见过一个更隐蔽的案例。某金融App的Spring Cloud Gateway配置了动态路由,路由断言里用了Host头做匹配。攻击者伪造Host为内部服务名internal-admin,网关直接把请求转发到了内网管理接口。这种漏洞在微服务架构里比传统单体应用危险十倍——因为内网服务通常没有二次鉴权。
别指望Spring Security自动兜底
很多人觉得加了Spring Security就万事大吉。实测下来,Spring Security 5.x的StrictHttpFirewall默认会拦截带%0d%0a的Host头,但对纯域名伪造毫无办法。我试过把Host改成attacker.com,请求照样进Controller,日志里打印出来的request.getRequestURL()已经变成了攻击者的域名。安全框架管的是认证授权,Host头校验属于传输层信任问题,两码事。
有个取巧的验证方法:在application.properties里加一行server.tomcat.use-relative-redirects=true,然后写个测试用例,用MockMvc发请求时手动设置.header("Host", "fake.com")。如果返回的重定向Location里出现了fake.com,恭喜你,中招了。
修复方案得从三个层面下手
第一层,Tomcat配置硬校验。在server.tomcat下加allowed-hosts=yourdomain.com,www.yourdomain.com(Spring Boot 2.7+支持),或者自定义Valve继承RemoteHostValve,重写invoke方法比对Host白名单。注意别用server.address,那个绑的是网卡IP,跟Host头没关系。
第二层,代码里别偷懒。所有需要拼接绝对URL的地方,比如邮件链接、支付回调、OAuth重定向,统统用配置项写死域名。我习惯在application.yml里定义app.base-url: https://api.mysite.com,然后用@Value注入。千万别用request.getScheme() + "://" + request.getServerName()这种写法,getServerName()返回的就是Host头里的值。
第三层,反向代理别帮倒忙。Nginx做前端时,proxy_set_header Host $host这行配置本身没问题,但如果Nginx没做Host白名单过滤,攻击者直接访问Nginx的IP,Host头照样能伪造。建议在Nginx里加if ($host !~ ^(yourdomain\.com|www\.yourdomain\.com)$) { return 444; },直接掐断连接。
最后说个真实教训。去年帮朋友排查一个Spring Boot博客系统,他发现后台总有人尝试重置管理员密码,但邮件却发到了自己邮箱。查了半天才发现,攻击者把Host改成localhost,系统生成的重置链接指向了本地,而管理员恰好在本机点开了链接——token就这么泄露了。Host头攻击有时候不需要多高深的技术,就赌你开发时少写一行校验。
- ·南阳理工学院官网入口
- ·防火墙国内外研究现状
- ·对于毒贩引诱吸毒的伎俩
- ·苹果手机诈骗
- ·如何找工作
- ·红黑网数据库
- ·网站平台搭建
- ·怎么举报网站网址
- ·靶场测试
- ·渗透工具包
