一, 漏洞背景
安全公告编号: CNTA-2020-0004
2020 年 02 月 20 日, 360CERT 监测发现 国家信息安全漏洞共享平台(CNVD) 收录了 CNVD-2020-10487 Apache Tomcat 文件包含漏洞.
CNVD-2020-10487/CVE-2020-1938 是文件包含漏洞, 攻击者可利用该高危漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件, 如: webapp 配置文件或源代码等.
受影响的版本包括: Tomcat 6,Tomcat 7 的 7.0.100 以下版本, Tomcat 8 的 8.5.51 以下版本, Tomcat 9 的 9.0.31 以下版本.
CNVD 对该漏洞的综合评级为 "高危".
二, 影响版本
- ,Apache Tomcat 9.x <9.0.31
- ,Apache Tomcat 8.x < 8.5.51
- ,Apache Tomcat 7.x < 7.0.100
- ,Apache Tomcat 6.x
三, 漏洞分析
3.1 AJP Connector
Apache Tomcat 服务器通过 Connector 连接器组件与客户程序建立连接, Connector 表示接收请求并返回响应的端点. 即 Connector 组件负责接收客户的请求, 以及把 Tomcat 服务器的响应结果发送给客户.
在 Apache Tomcat 服务器中我们平时用的最多的 8080 端口, 就是所谓的 Http Connector, 使用 Http(HTTP/1.1)协议
在 conf/server.xml 文件里, 他对应的配置为:
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
而 AJP Connector, 它使用的是 AJP 协议 (Apache Jserv Protocol) 是定向包协议. 因为性能原因, 使用二进制格式来传输可读性文本, 它能降低 HTTP 请求的处理成本, 因此主要在需要集群, 反向代理的场景被使用.
Ajp 协议对应的配置为:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Tomcat 服务器默认对外网开启该端口 Web 客户访问 Tomcat 服务器的两种方式:
3.2 代码分析
漏洞产生的主要位置在处理 Ajp 请求内容的地方 org.apache.coyote.ajp.AbstractAjpProcessor.java#prepareRequest()
这里首先判断 SCAREQ_ATTRIBUTE, 意思是如果使用的 Ajp 属性并不在上述的列表中, 那么就进入这个条件
SCAREQREMOTEPORT 对应的是 AJPREMOTEPORT, 这里指的是对远程端口的转发, Ajp13 并没有转发远程端口, 但是接受转发的数据作为远程端口.
于是这里我们可以进行对 Ajp 设置特定的属性, 封装为 request 对象的 Attribute 属性 比如以下三个属性可以被设置:
- javax.servlet.include.request_uri
- javax.servlet.include.path_info
- javax.servlet.include.servlet_path
3.3 任意文件读取
当请求被分发到 org.apache.catalina.servlets.DefaultServlet#serveResource()方法
调用 getRelativePath 方法, 需要获取到 request_uri 不为 null, 然后从 request 对象中获取并设置 pathInfo 属性值和 servletPath 属性值
接着往下看到 getResource 方法时, 会把 path 作为参数传入, 获取到文件的源码
漏洞演示: 读取到 / Web-INF/Web.xml 文件
3.4 命令执行
当在处理 jsp 请求的 uri 时, 会调用 org.apache.jasper.servlet.JspServlet#service()
最后会将 pathinfo 交给 serviceJspFile 处理, 以 jsp 解析该文件, 所以当我们可以控制服务器上的 jsp 文件的时候, 比如存在 jsp 的文件上传, 这时, 就能够造成 rce
漏洞演示: 造成 rce
四, 修复建议
Apache Tomcat 6 已经停止维护, 请升级到最新受支持的 Tomcat 版本以免遭受漏洞影响, 请更新到如下 Tomcat 版本:
Tomcat 分支 | 版本号 |
---|---|
Tomcat 7 | 7.0.0100 |
Tomcat 8 | 8.5.51 |
Tomcat 9 | 9.0.31 |
下载链接如下:
7.0.100 版本: https://tomcat.apache.org/download-70.cgi
8.5.51 版本: https://tomcat.apache.org/download-80.cgi
9.0.31 版本 https://tomcat.apache.org/download-90.cgi
作者: Hu3sky
- www.anquanke.com/post/id/199448
- END
来源: https://www.qcloud.com/developer/article/1591630