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了。
参考链接
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果