Tomcat任意文件上传 CVE-2017-12615
[toc]
一. 漏洞概述
2017年9月19日,Apache Tomcat 官方确认并修复了两个高危漏洞,漏洞 CVE 编号:CVE-2017-12615 ,该漏洞受影响版本为7.0-7.80之间,官方评级为高危,通过精心构造的攻击请求,向用户服务器上传恶意 JSP 文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码,存在高安全风险。
二. 漏洞基本信息
漏洞编号:
CVE-2017-12615
漏洞名称:
CVE-2017-12615-远程代码执行漏洞
官方评级:
高危,实际测试漏洞危害较低
漏洞描述:
- CVE-2017-12615:远程代码执行漏洞
当 Tomcat 运行在 Windows 操作系统时,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。
在一定的条件下,通过以上两个漏洞可在用户服务器上执行任意代码,从而导致数据泄露或获取服务器权限,存在高安全风险。
漏洞利用条件:
- CVE-2017-12615 漏洞利用需要在 Windows 环境,且需要将 readonly 初始化参数由默认值设置为 false,经过实际测试,Tomcat 7.x 版本内 web.xml 配置文件内默认配置无 readonly 参数,需要手工添加,默认配置条件下不受此漏洞影响。
影响范围:
CVE-2017-12615影响范围:Apache Tomcat 7.0.0 - 7.0.79 (windows环境)
三. 漏洞详细分析信息
3.1. 环境搭建
在项目结构中添加如下两个库和源码,这样就可以看到tomcat的源码,并下断点进行调试
在conf/web.xml中修改配置
在org.apache.catalina.servlets.DefaultServlet中添加readonly并设置为false
3.2. 原理分析
本次 Apache Tomcat 两个 CVE 漏洞涉及到 DefaultServlet 和 JspServlet,DefaultServlet 的作用是处理静态文件 ,JspServlet 的作用是处理 jsp 与 jspx 文件的请求,同时 DefaultServlet 可以处理 PUT 或 DELETE 请求,以下是默认配置情况:
除了 jsp 和 jspx 默认是由 org.apache.jasper.servlet.JspServlet
处理,其他默认都是由org.apache.catalina.servlets.DefaultServlet
来处理。
可以看出即使设置 readonly 为 false,默认 tomcat 也不允许 PUT 上传 jsp 和 jspx 文件的,因为后端都用org.apache.jasper.servlet.JspServlet
来处理 jsp 或是 jspx 后缀的请求了,而 JspServlet 中没有 PUT 上传的逻辑,PUT 的代码实现只存在于 DefaultServlet 中。
这个漏洞的根本是通过构造特殊后缀名,绕过了 tomcat 检测,让它用 DefaultServlet 的逻辑去处理请求,从而上传 jsp 文件
FileOutputStream 特性
上面遗留了一个问题就是当请求 jsp%20
或是 jsp::$DATA
后缀的时候,为什么最终却写入 .jsp
后缀的文件,这些其实是 java.io. FileOutputStream 的问题了,具体需要分析 jdk 的 C 代码才能得到解答
java.io.File 的特性
前面没有说evil.jsp/
,这种方法也可以 PUT 上传,但是不同于上面两种,这种方法是利用了 File 类的特性
在这里这个 normalize(path, n, (prev == slash) ? i - 1 : i)
会将文件名末尾的/过滤掉,所以可以导致后面文件写入 jsp 文件。
在分析的时候,我们也发现 File 类存在一个利用点,normalize 函数过滤掉了末尾斜杠。我们通过构造请求测试,发现可以被利用,通过对全版本测试,发现 Windows、Linux、Unix 下的 Apache Tomcat 5.X、6.X、7.x、8.x、9.x 版本均受到影响,从这点可以看出官方给出的补丁存在绕过,目前该问题已经得到 Apache 官方的确认。
Reference
CVE-2017-12615/CVE-2017-12616:Tomcat信息泄漏和远程代码执行漏洞分析报告 (seebug.org)
(210条消息) 漏洞复现之CVE-2017-12615_Blood_Pupil的博客-CSDN博客_cve-2017-12615漏洞利用