Apache Tomcat文件蕴含缝隙分析

颁布功夫 2020-02-21

一、缝隙概述


2020年2月20日,,,,,,国度信息安全缝隙共享平台(CNVD)颁布关于Apache Tomcat的安全布告,,,,,,Apache Tomcat文件蕴含缝隙(CNVD-2020-10487,,,,,,对应CVE-2020-1938)。。。。 。Tomcat AJP和谈由于存在实现缺点导致有关参数可控,,,,,,攻击者利用该缝隙可通过机关特定参数,,,,,,读取服务器webapp下的肆意文件。。。。 。若服务器端同时存在文件上传职能,,,,,,攻击者可进一步实现远程代码的执杏祝。。。 。


二、缝隙分析


通过对Apache Tomcat源码进行分析,,,,,,发现Tomcat在处置ajp和谈时存在缝隙,,,,,,可通过挪用request.setAttribute为Tomcat设置肆意request属性,,,,,,如下图所示:


8827太阳集团(Macau)股份有限公司-Official website


通过度析复现发现Tomcat ajp和谈存在web目录下肆意文件读取缝隙以及JSP文件蕴含缝隙。。。。 。当ajp URI设置为非jsp蹊径时,,,,,,Tomcat会挪用DefaultServlet处置,,,,,,此时会导致web目录肆意文件读取缝隙。。。。 。当ajp URI设置为jsp蹊径时,,,,,,Tomcat会挪用JspServlet处置,,,,,,此时会导致JSP文件蕴含缝隙。。。。 。


2.1 Web目录肆意文件读取缝隙


当ajp URI设置为非jsp蹊径时,,,,,,Tomcat会挪用DefaultServlet处置,我们必要节造如下两个属性:

javax.servlet.include.path_info

javax.servlet.include.servlet_path


其中,,,,,,javax.servlet.include.servlet_path属性为当前项目蹊径、javax.servlet.include.path_info属性为目录蹊径。。。。 。而后,,,,,,通过DefaultServlet类的getRelativePath步骤进行拼接获得path蹊径。。。。 。如下图所示:


8827太阳集团(Macau)股份有限公司-Official website


最后,,,,,,会将path带入到getResource(path)步骤中造成肆意文件读取。。。。 。如下图所示:


8827太阳集团(Macau)股份有限公司-Official website


利用该缝隙成功读取到/WEB-INF/目录下web.xml文件。。。。 。


8827太阳集团(Macau)股份有限公司-Official website


2.2 Jsp文件蕴含缝隙


当ajp URI设置为jsp蹊径时,,,,,,Tomcat会挪用JspServlet的service步骤处置,,,,,,如下图所示:


8827太阳集团(Macau)股份有限公司-Official website


同样会获取javax.servlet.include.path_info、javax.servlet.include.servlet_path这两个属性(经过上面的分析我们已经知路能够通过ajp和谈节造这两个属性)。。。。 。将这两个属性对应的值拼接到jspURi变量中,,,,,,最后交给serviceJspFile步骤处置,,,,,,如下图所示:


8827太阳集团(Macau)股份有限公司-Official website


Venus.txt文件代码如下所示:


8827太阳集团(Macau)股份有限公司-Official website


成功RCE了局如下图所示:


8827太阳集团(Macau)股份有限公司-Official website


三、影响版本


Tomcat 6

Tomcat 7

Tomcat 8

Tomcat 9


四、躲避规划


将Tomcat立即升级到9.0.31、8.5.51或7.0.100版本进行建复。。。。 。


禁用AJP和谈。。。。 。

编纂 /conf/server.xml,,,,,,找到如下行:

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

将此行注解掉(也可删掉该行):

<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->


配置secret来设置AJP和谈的认证凭证。。。。 。


例如(把稳必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被等闲猜解的值):

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>