Java反序列化FastJson篇之漏洞分析(二)

Java反序列化FastJson篇之漏洞分析(二)
Natro92前言
上篇跟着网上的教程顺了一遍流程,主要是为了能更熟悉动态调试。
分析
FastJSON的解析会分别触发set方法和get方法,而且根据是否有@type字段,会解析setter或者getter方法的恶意代码。
要求
FastJson反序列化和原生反序列化的差别:
- FastJson不需要有
Serializable字段 - 不需要变量不是
transient或者可控变量- 有
setter - 或者
public/static - 或者
getter需要满足要求:
- 有
- 反序列化入口点是
setter或者getter - 执行点可以选择反射或者类加载
FastJson版本<1.2.24
JdbcRowSetImpl类+JNDI出网
JdbcRowSetImpl这个类其中的connect函数里面使用了lookup函数,可以造成JNDI注入
然后找下去,看看getDataSourceName所在的BaseRowSet类。
发现有setter方法:
可以修改其参数。继续找能调用connect方法的set/get方法,优先找set方法,因为get方法需要有返回参数限制。ctrl + shift + alt + f7全局寻找一下,直接发现一个setAutoCommit方法:
我们这里测试一下试一试,生成一个测试反连。
注意这里Payload配置之后要点一下生成🤦。
1 | package com.natro92; |
PS:这里JDK版本需要满足 8u161 < jdk < 8u191
TemplatesImpl类+动态类加载(不出网)
由于变量都是private所以需要在反序列化时加上Feature.SupportNonPublicField参数。
这个其实前面已经看了好几次了,这里再看下:
先到getOutputProperties
进入newTransformer
再进getTransletInstance中
然后就是熟悉的对_name和_class的判断。
再进defineTransletClasses
这里如果看过我前面的内容,这里应该很熟悉了:
_bytecodes[]为构造注入的位置_tfactory不为空,且需要为AbstractTranslet子类。- 加载
defineClass
这里总结下需要满足的点:
Feature.SupportNonPublicField参数_bytecodes[]需进行base64编码_bytecodes[]中加载的类需为AbstractTranslet的子类_name不为null_tfactory不为null
然后按照要求编写Poc:
1 | package com.natro92; |
FastJsonBcel类+动态类加载(不出网)
这个缺个依赖,没整明白。可以看看原文:
FastJson版本>1.2.25
过两天再看,干点别的,TODO了。
参考链接
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果





















