jackson的二次反序列化分析
1174735059082055 发表于 四川 WEB安全 479浏览 · 2025-06-22 11:25

jackson的二次反序列化分析

jackson 调用 getter 方法这条链子在平时 CTF 比赛中用的非常多,一个是因为 spring boot 框架自带 jackson 依赖,二是它反序列化没有黑名单。而一般遇到重写了 resolveClass 方法的黑名单,常用的是 jackson+SignedObject 二次反序列化进行绕过。

SignedObject 二次反序列化

该类是 java.security 下一个用于创建真实运行时对象的类,更具体地说,SignedObject 包含另一个 Serializable 对象。

先看其构造函数方法。

图片加载失败


其参数接受一个可序列化的对象,然后又进行了一次序列化,继续看到该类的 getObject 方法,

图片加载失败


进行了反序列化,content 是我们可以控制的。构造一个恶意的 SignedObject 对象。

那么现在就是要看恶意对象的选择了,一般来说也就是我们被加入黑名单的反序列化链。

jackson 调用 getter 分析

jackson 序列化会调用任意 getter 方法,这个不用多说什么,常用的是 ObjectMapper#writeValueAsString 方法进行序列化 bean 对象为字符串。

然后是 jackson 调用任意 getter 方法的利用链,至于前面触发 tostring 的链子选择就比较多了,

还是简单看一下,POJONode 中不存在有 toString 方法的实现,但是其父类的父类(BaseJsonNode)中存在,

图片加载失败


图片加载失败


调用了 nodeToString 方法,

图片加载失败


调用了 writeValueAsString 方法进行序列化这里就会调用 getter 方法,然后剩下的就是加载恶意类进行命令执行了。需要注意的是writeValueAsString 方法序列化 bean 对象为字符串时会调用所有对象的 getter 方法。

DASCTF 2025-再短一点点

反编译 jar 包后看到 /deser 路由可以反序列化,有长度限制以及重写了 resolveClass 方法存在黑名单

图片加载失败


在 flag 路由对 /a 文件进行检测,如果没有这个文件访问 /flag 就会获得 flag,

图片加载失败


再看看 resolveClass 中过滤了哪些类,有 BadAttributeValueExpException 链以及 spring aop 链的类,

图片加载失败


依赖有 jackson 而且没有过滤 SignedObject ,可以打 jackson 的二次反序列化,这里选择通过 EventListenerList 来触发 tostring 方法,

构造下面 payload ,

减少字节码属性

这里通过 createObjWithoutConstructor 方法来实列化对象可以把对象的无关属性进行置空来减少字节长度,

图片加载失败


对比看到利用 createObjWithoutConstructor 来获得的对象所有属性为 null,后面再通过反射把需要的属性赋上值就行了,不会影响反序列化链。

图片加载失败


注意到题目中反序列化用了 new InflaterInputStream,所有我们获得的字节码还需要压缩一下,

但是最后获得的结果还是太长了,问了 GPT 发现还可以将恶意类的调试信息进行删除

这样确实又减少了十多个字节,不过依然杯水车薪,长度还是有 1300 多个,后面又把网上的 payload 缩短方法都看了一下,还是不满足条件。

jackson 序列化原理缩减

上面 jackson 调用 getter 分析最后说了,writeValueAsString 方法序列化 bean 对象为字符串时会调用所有对象的 getter 方法。

那么实际上我们的二次反序列化根本不需要那么麻烦,我们可以不用通过 SignedObject#getObject 来触发恶意 readobject 实现利用,我只需要 SignedObject#getObject 方法返回个正常类就行了,比如把链子换为如下

这里通过 SignedObject#getObject 返回 TemplatesImpl 类来绕过黑名单,

图片加载失败


然后 writeValueAsString 方法会继续序列化 TemplatesImpl 类。从而调用其 getter 方法,调用栈

图片加载失败


最后也能触发到 TemplatesImpl#getOutputProperties 进行命令执行。所以最后 poc

压缩后长度只有 1272

图片加载失败


删除文件 a 访问 /flag 即可获得 flag,

图片加载失败


1 条评论
某人
表情
可输入 255
用户DkwjgOn1V1
2025-06-25 04:15 0 回复
哥,你好,我想咨询点事