千家信息网

如何进行ApacheTomca远程执行代码CVE-2019-0232漏洞浅析和复现

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章给大家介绍如何进行ApacheTomca远程执行代码CVE-2019-0232漏洞浅析和复现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。ApacheTomca远程执行代
千家信息网最后更新 2026年10月31日如何进行ApacheTomca远程执行代码CVE-2019-0232漏洞浅析和复现

这篇文章给大家介绍如何进行ApacheTomca远程执行代码CVE-2019-0232漏洞浅析和复现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

ApacheTomca远程执行代码(CVE-2019-0232)漏洞浅析和复现

一、 漏洞背景

Apache Tomcat,俗称Tomcat Server,是一个开源的JavaServlet容器,由社区在Apache Software Foundation(ASF)的支持下开发。它实现了多个Java EE规范,包括Java Servlet,JavaServer Pages(JSP),Java表达式语言(EL)和WebSocket,并提供了一个"纯Java"HTTP Web服务器环境,Java代码可以在该环境中运行。

2019年4月15日,Nightwatch网络安全发布的信息对CVE-2019-0232,包括Apache Tomcat上的通用网关接口(CGI)Servlet的一个远程执行代码(RCE)漏洞。这种高严重性漏洞可能允许攻击者通过滥用由Tomcat CGIServlet输入验证错误引起的操作系统命令注入来执行任意命令。

二、 影响版本

影响版本如下:

tomcat 7.0.04之前

tomcat 8.5.40之前

tomcat 9.0.19之前

三、 漏洞分析

CGI(CommonGateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。CGI脚本用于执行Tomcat Java虚拟机(JVM)外部的程序。默认情况下禁用的CGI Servlet用于生成从查询字符串生成的命令行参数。由于Java运行时环境(JRE)将命令行参数传递给Windows的错误,在启用CGI Servlet参数enableCmdLineArguments的Windows计算机上运行的Tomcat服务器很容易受到远程代码执行的影响。

ApacheTomcat文件web.xml用于为加载到Tomcat实例中的所有Web应用程序定义默认值。CGI Servlet是默认提供的servlet之一。该servlet支持执行符合CGI规范的外部应用程序。通常,CGI Servlet映射到URL模式"/cgi-bin / *",这意味着任何执行的CGI应用程序必须存在于Web应用程序中。


通过调用CreateProcess()函数启动Windows操作系统中的新进程,该函数将以下命令行作为字符串(对CreateProcess的lpComandLine参数):int CreateProcess(...,lpComandLine,...)

Windows中的参数不是作为字符串数组单独传递的,而是作为单个命令行字符串传递的。这要求程序通过使用GetCommandLine() API 提取命令行字符串然后使用CommandLineArgvW()辅助函数解析参数字符串来解析命令行本身。Windows的命令行字符串流程图如下:

漏洞是由于命令行参数从JRE到Windows的不正确传递而产生的,对于Java应用程序,在CreateProcess()函数启动之前调用ProcessBuilder()。然后将参数传递给ProcessImpl()的静态方法start ,这是一个依赖于平台的类。在ProcessImpl()的Windows实现中,start方法调用ProcessImpl()的私有构造函数,该构造函数为CreateProcess调用创建命令行。Java应用程序的命令行字符串流程图如下:

ProcessImpl()构建Cmdline并将其传递给CreateProcess() Windows函数,之后CreateProcess() 在cmd.exe shell环境中执行.bat和.cmd文件。

如果要运行的文件包含.bat或.cmd扩展名,则要运行的映像将变为cmd.exe,即Windows命令提示符。然后CreateProcess()在阶段1重新启动,批处理文件的名称作为cmd.exe的第一个参数传递。这导致'hello.bat ...'成为'C:\ Windows \ system32 \cmd.exe / c"hello.bat ..." '。由于CommandLineToArgvW的引用规则与cmd的引用规则不同,这意味着需要应用一组额外的引用规则以避免cmd.exe解释的命令行中的命令注入。

由于Java(ProcessImpl())确实没有额外的报价为这种隐含的cmd.exe上传递的参数调用推广,通过加工参数的cmd.exe现在被用来执行,呈现固有的问题,如果参数不传递给cmd.exe的正确。

对于cmd.exe,我们首先理解cmd本质上是一个文本预处理器:给定一个命令行,它进行一系列文本转换,然后将转换后的命令行交给CreateProcess()。某些转换用其值替换环境变量名称。转换,例如由&,||,&&运算符触发的转换,将命令行拆分为几个部分。所有cmd的转换都由以下元字符之一触发:(,),%,!,^,",<,>,&和|。元字符"特别有趣:当cmd正在转换命令行并看到"时,它会将"复制"到新的命令行,然后开始将字符从旧命令行复制到新命令行,而不会看到是否有任何这些字符是元字符。这一直持续到cmd到达命令行的末尾,进入变量替换,或者看到另一个"。

如果我们依赖cmd的"-behavior来保护参数,使用引号会产生意外行为。通过将不受信任的数据作为命令行参数传递,由此约定不匹配引起的错误成为安全问题。

例如,以下内容:

hello.bat"dir\"&whoami"

0:[hello.bat]

1:[&dir]

这里,cmd将&metacharacter解释为命令分隔符,因为从它的角度来看,&字符位于引用区域之外。在这种情况下,'whoami'可以被任意数量的有害命令所取代。当使用hello.bat运行上面显示的命令时实现命令执行。

四、 漏洞复现

首先下载有漏洞的tomcat版本,加压到响应文件夹,然后配置环境变量。

然后修改conten.xml


修改web.xml,添加一些参数并在web.xml文件中启用CGIServlet。

两个文件修改后,启动服务器,访问http://localhost:8080/

成功访问到tomcat后,创建hello.bat脚本放入cgi-bin目录下。

hello.bat内容

然后访问http://localhost:8080/cgi-bin/hello.bat?dir,显示如下命令执行成功。

五、 修复建议

下载Apache Tomcat官方补丁尽快升级进行防护。同时,用户可以将CGI Servlet初始化参数enableCmdLineArguments设置为false来进行防护。

关于如何进行ApacheTomca远程执行代码CVE-2019-0232漏洞浅析和复现就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

命令 参数 程序 字符 漏洞 字符串 应用 函数 应用程序 文件 代码 服务器 环境 服务 运行 内容 元字符 变量 版本 规则 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网高科技 广东万易互联网科技有限公司惠州分公司 苏州找大状互联网科技有限公司 科技和互联网公司 互联网和科技创新 互联网科技与金融科技 苏州互联网科技贷款公司 易通互联网络科技有限公司 齐家互联网科技有限公司 科技大学互联网专业好不好 深圳前海聚择互联网科技有限公司 华服互联网科技官网 广州恒生互联网科技有限 黑科技闪耀互联网之光 青海科技产业互联网发展 无锡工业互联网科技有限公司 互联网公司高科技产品 江苏苏星互联网科技有限公司 互联网科技快讯热点 云南互联网科技学费 咖啡网 赫美联合互联网科技 温州喔噻互联网科技有限公司 互联网科技教育视频 玉溪互联网科技怎么选 苏州铭阳互联网科技有限公司 成都互联网科技公司工作好不好 绵阳真晨互联网科技有限公司 北京品多多互联网科技有限公司 互联网大会出现的黑科技
0