如何修复 Tomcat 9 上的目录遍历漏洞

Posted

技术标签:

【中文标题】如何修复 Tomcat 9 上的目录遍历漏洞【英文标题】:How to fix directory traversal vulnerability on Tomcat 9 【发布时间】:2021-10-24 18:34:21 【问题描述】:

我在 Tomcat 9 容器 (Debian 10.8) 上有一个 JEE 服务。在它前面是一个 Apache Web 服务器 + mod_proxy_ajp。

在我的 VH 中,我没有任何 /manager/html 上下文的 ProxyPass 规则,但如果在 Web 客户端上我重写我的 URL 添加 /..;/manager/html(例如:https://www.example.org/site/..;/manager/html)Tomcat 管理器要求凭据。

有什么技巧可以避免吗?也许使用modsecurity? 谢谢。

【问题讨论】:

为什么不直接将代理服务器配置为拒绝所有带分号的路径?甚至只是将它们重写回家 【参考方案1】:

由于 path parameters 仅在 Tomcat 中用于会话跟踪(作为 cookie 的替代品),因此您可以在 Apache2 中从 .. 路径段安全地删除它们:

RewriteEngine on
RewriteRule ^(.*)/\.\.;[^/]*(.*)$ $1/..$2 [N]

您也可以完全删除它们:

RewriteEngine on
RewriteRule ^(.*);[^/]*(.*)$ $1$2 [N]

并将 Tomcat 配置为仅在 $CATALINA_BASE/conf/web.xml 中使用 cookie 进行会话跟踪:

    <session-config>
        ...
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>

【讨论】:

【参考方案2】:

我使用 mod_security 规则解决了这个问题:

SecRule REQUEST_URI "@rx ..;/" "phase:1,severity:'CRITICAL',deny,id:129"

有效。

【讨论】:

您的正则表达式无法捕捉到所有可能性:/app/..;abc/manager/html 仍将被 Tomcat 重写为 /manager/html。试试/\.\.;[^/]*/

以上是关于如何修复 Tomcat 9 上的目录遍历漏洞的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Apache Tomcat 目录遍历漏洞

漏洞及修复——Apache/IIS目录遍历

tomcat漏洞怎么修复

Tomcat服务器版本号泄露-低危漏洞修复

Tomcat example 应用信息泄漏漏洞及修复

Tomcat example 应用信息泄漏漏洞及修复