如何修复Tomcat 9搭配Apache代理时的目录遍历漏洞
问题根源
该绕过风险的核心原因是mod_proxy默认匹配ProxyPass规则时会剥离
;及之后的路径参数,仅用前面的路径做规则匹配,但实际转发请求时会把完整URL发给Tomcat。而Tomcat解析路径时会自动忽略;后的路径参数,导致..路径遍历生效,绕过了未配置manager上下文代理的规则限制。
可落地的规避方案
1. Apache侧配置拦截(最直接,立即生效)
- 直接拦截所有Tomcat管理端相关路径请求,在虚拟主机配置中添加如下规则,命中直接返回403:
<LocationMatch "/(manager|host-manager)"> Require all denied </LocationMatch>
- 替换普通
ProxyPass为正则匹配的ProxyPassMatch,确保仅转发匹配指定前缀的请求到Tomcat,示例如下:
# 原配置示例:ProxyPass /site/ ajp://127.0.0.1:8009/site/ # 修改为正则匹配模式,仅转发/site/开头的请求 ProxyPassMatch ^/site/(.*)$ ajp://127.0.0.1:8009/site/$1 ProxyPassReverse /site/ ajp://127.0.0.1:8009/site/
2. Tomcat侧加固(兜底防护,避免代理漏防)
- 如果不需要使用Tomcat管理端,直接删除
tomcat/webapps目录下的manager和host-manager文件夹,彻底消除风险。 - 如果需要使用管理端,修改
tomcat/conf/Catalina/localhost/manager.xml和host-manager.xml,添加来源IP限制,仅允许本地访问:
<Context antiResourceLocking="false" privileged="true" > <!-- 添加如下RemoteAddrValve规则 --> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1" /> </Context>
ModSecurity防护实现
完全可以通过ModSecurity实现防护,添加自定义规则即可拦截这类绕过尝试,规则示例:
SecRule REQUEST_URI "\.\.;/" "id:10001,deny,status:403,msg:'Semicolon path traversal bypass attempt'"
如果已开启ModSecurity核心规则集(CRS),默认的路径遍历防护规则也会拦截此类携带..的异常路径请求,无需额外配置。
内容的提问来源于stack exchange,提问作者samuelj
相关产品推荐
相关产品推荐

