justDeserialize 绕过黑名单挖掘利用链
1398133550745333 CTF 242浏览 · 2025-03-27 04:48

justDeserialize 绕过黑名单挖掘利用链

前言

当时线下的时候很多题,当时一开始下不了附件,之后看了一下,也只有一个 web 题目,做了半天,拿着工具倒着推,一步一步看了半天,也卡着没有做出来,之后看到https://gsbp0.github.io/post/%E8%BD%AF%E4%BB%B6%E6%94%BB%E9%98%B2%E8%B5%9B%E7%8E%B0%E5%9C%BA%E8%B5%9B%E4%B8%8A%E5%AF%B9justdeserialize%E6%94%BB%E5%87%BB%E7%9A%84%E5%87%A0%E6%AC%A1%E5%B0%9D%E8%AF%95/#%E7%AC%AC%E4%BA%8C%E6%AD%A5 学习学习

源码分析

目录结构



一看就是有黑名单的,还给了自己写的类

依赖



路由代码

一共两个防护,第一个就是对我们的字符串的防护 这个 UTF8 已经考过很多次了,而且本次研究的重点也不是这个,直接删除

然后就是自定义的 MyObjectInputStream类了

直接在 resolveClass 禁用,是不能使用 UTF-8 绕过的,只能使用一些新的手法去绕过了

而且黑名单 ban 的类也是挺多的

springAOP 原生链

这里会使用到 springAOP 的原生链,当时确实还不知道这个链子

使用 GSBP 师傅的 poc 简单分析一下

POC

调试分析

这里简单分析一下

首先进入很熟悉的类 BadAttributeValueExpException



其中 valObj 被赋值为我们的代理类,会触发它的 invoke 方法

invoke:215, JdkDynamicAopProxy (org.springframework.aop.framework) [1]

然后进入 proceed 方法

这个方法会一路调用到我们的 invokeAdviceMethodWithGivenArgs 方法

而这个方法就是我们的 sink 点了,可以看出来如果可以控制我们的参数,那么是可以实现调用任意类的任意方法的

而控制一直跟踪的话是来源于我们的 invoke 方法

跟进 getInterceptorsAndDynamicInterceptionAdvice 方法

目标是返回的 cached 为我们的恶意构造的类

因为缓存中一开是没有的,所以需要调用到 getInterceptorsAndDynamicInterceptionAdvice 方法

需要 return 成功,那么只需要看 add 的逻辑,而 add 都是 add 的 interceptors

跟进 getInterceptors 方法

需要满足实现 MethodInterceptor 接口才可以 return

再结合我们的 payload 的构造大概弄清楚了原理

实际上就是溯源到控制我们的恶意类,然后通过动态代理去链接到我们的 sink 点,实现控制 source 到 sink 的攻击



JdbcRowSetImpl 攻击

有了上面的利用链,这道题目就比较简单了,因为上面的链子使用到的类都没有被 ban 掉

只需要套上我们的 JdbcRowSetImpl 来打一个 JNDI 就 ok 了

当然这里需要注意的就是 BadAttributeValueExpException 被 ban 掉了

需要我们替换,根据题目给出的 user

很明显是在叫我们打 CB 那一套,因为只需要实现触发可控对象的方法就 ok 了

这里重载还给了提示

首先就是如何触发 compare 方法了,这个 CB 链是有说过的

使用 GSBP 的 POC,主要懒得再次去写一个,但是这里因为打 jndi 的话没有使用到



POC

运行成功弹出计算器



JNDI 服务也接收到了请求




调试分析

首先是我们的 cb 部分

readObject:795, PriorityQueue (java.util)

跟进 heapify



跟进 siftDown

跟进 siftDownUsingComparator



因为我们传入的 comparator 为代理类





调用代理类的方法的时候会调用invoke 方法

之后就是和 AOP 一样的效果了





成功来到 JNDI 的部分

触发了 JNDI 注入

hsql 二次反序列化

因为题目给了依赖,还可以尝试打 hsql 二次反序列化

这个如果直接使用工具就非常方便了



利用链如下



首先打的是一个 DruidJdbcAttack,这个可以触发我们的 jdbc 攻击,而题目依赖又正好给了 hsqldb:org.hsqldb.jdbcDriver

这里可以打一个组合拳,因为 hsql 可以利用的 sink 还是很多的,可以打一个二次反序列化

在二次反序列化的时候我们就不需要考虑黑名单了,直接打一个 jackson 的原生链

生成我们的数据后直接开始攻击

POC







收到请求成功弹出计算器

0 条评论
某人
表情
可输入 255