CVE-2017-12615 实战防御:5步加固Tomcat配置与WAF规则编写
CVE-2017-12615 实战防御:5步加固Tomcat配置与WAF规则编写
Tomcat作为Java Web应用的核心容器,其安全性直接关系到业务系统的稳定运行。CVE-2017-12615漏洞暴露了不当配置可能导致的严重风险——攻击者通过精心构造的PUT请求可上传恶意JSP文件,进而获取服务器控制权。本文将提供一套从漏洞检测到彻底修复的完整解决方案,涵盖自动化检测脚本、WAF规则编写和系统加固清单。
1. 漏洞原理深度解析
该漏洞的本质是Tomcat默认Servlet配置缺陷与操作系统特性结合的产物。当同时满足以下两个条件时,漏洞即被触发:
- 配置缺陷:
conf/web.xml中DefaultServlet的readonly参数被显式设置为false - 方法启用:服务器未禁用HTTP PUT方法
攻击者利用链条:
- 通过PUT请求上传文件时,Tomcat对文件名的处理存在逻辑缺陷
- Windows系统的文件名解析特性(如
::$DATA流、自动去除空格等)可绕过后缀检查 - Linux系统可通过添加
/字符绕过(如shell.jsp/)
关键提示:即使业务系统不需要PUT/DELETE方法,Tomcat 7.x版本默认仍会响应这些请求,这是许多管理员容易忽视的风险点。
2. 自动化漏洞检测方案
2.1 快速检测脚本
以下Python脚本可批量扫描web.xml中的不安全配置:
#!/usr/bin/env python3 import os import xml.etree.ElementTree as ET def check_webxml(config_path): try: tree = ET.parse(config_path) root = tree.getroot() for servlet in root.findall('.//servlet'): if servlet.find('servlet-name').text == 'default': for init_param in servlet.findall('.//init-param'): if init_param.find('param-name').text == 'readonly': value = init_param.find('param-value').text.lower() if value == 'false': return True return False except Exception as e: print(f"检测异常: {str(e)}") return None if __name__ == '__main__': import sys if len(sys.argv) != 2: print("Usage: python scanner.py /path/to/tomcat/conf") sys.exit(1) webxml_path = os.path.join(sys.argv[1], 'web.xml') if not os.path.exists(webxml_path): print(f"错误: {webxml_path} 不存在") sys.exit(2) is_vulnerable = check_webxml(webxml_path) print(f"检测结果: {'存在风险配置' if is_vulnerable else '未发现风险配置'}")2.2 检测指标说明
| 检测项 | 安全值 | 风险值 | 修复优先级 |
|---|---|---|---|
| readonly参数 | true | false | 紧急 |
| PUT方法状态 | 禁用 | 启用 | 高危 |
| Tomcat版本 | ≥7.0.81 | ≤7.0.79 | 高危 |
3. 多层次防御体系构建
3.1 WAF规则配置(Nginx示例)
在Nginx配置中添加以下规则拦截恶意PUT请求:
location / { # 基础防护规则 if ($request_method ~* "(PUT|DELETE)") { return 405; } # 拦截异常JSP上传请求 if ($uri ~* "\.jsp($|/|\s|:|%20)") { return 403; } # 拦截Windows特性绕过尝试 if ($uri ~* "::$DATA") { return 403; } }3.2 Apache ModSecurity规则
SecRule REQUEST_METHOD "^PUT$" "id:10001,phase:1,deny,msg:'Block PUT requests'" SecRule REQUEST_URI "\.jsp($|/|%20|:|\\$DATA)" "id:10002,phase:1,deny,msg:'Block JSP upload attempts'"4. 五步加固检查清单
4.1 版本升级
# 查看当前版本 ./bin/version.sh # 升级步骤 1. 备份conf/、webapps/目录 2. 下载Tomcat 7.0.81+或8.5.x 3. 停止旧服务 → 替换文件 → 恢复配置 4. 验证新版本:http://localhost:8080/manager/status4.2 配置修复
修改conf/web.xml确保包含:
<init-param> <param-name>readonly</param-name> <param-value>true</param-value> </init-param>4.3 权限最小化
# 创建专用运行账户 useradd -r -s /bin/false tomcat_user chown -R tomcat_user:tomcat_user /opt/tomcat4.4 网络层防护
# 使用iptables限制管理接口访问 iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 8080 -j DROP4.5 监控与审计
# 实时监控webapps目录变化 inotifywait -m -r -e create,modify /opt/tomcat/webapps/ | while read path action file; do echo "WARNING: File change detected - $path$file at $(date)" >> /var/log/tomcat_audit.log done5. 应急响应指南
当发现可疑活动时,按以下流程处置:
- 立即隔离:断开受影响服务器网络
- 取证分析:
# 查找最近修改的JSP文件 find /opt/tomcat/webapps/ -name "*.jsp" -mtime -1 -ls # 检查访问日志中的PUT请求 grep -i "PUT" /opt/tomcat/logs/localhost_access_log.* - 漏洞修复:执行前述加固措施
- 后门排查:使用工具检查常见Webshell特征
- 恢复上线:通过安全测试后重新接入服务
深度防御建议:结合SIEM系统对以下异常行为建立告警规则:
- 短时间内大量405/403状态码
- 包含特殊字符(如
::$DATA)的URI请求 - webapps目录下新增可执行文件
