fastjson 1.2.24 反序列化漏洞(审计分析)
环境
JDK 8u181
Fastjson 1.2.24
POC
跟进 parse 方法
跟进到底层deserialze 方法
Poc 中传入的 dataSourceName : ldap://192.168.3.229:8084/vnSYPYwMs 值
这里实际对应 setDataSourceName 方法,调用此方法并传入 ldap
跟进 setDataSourceName 方法,这里只是简单赋值
步出回此方法
继续步出,进入parseRest方法
跟进 deserialze 方法
继续跟进 setValue 方法
此处通过 invoke 反射实现方法
POC 传入的 autoCommit : true 对应
setAutoCommit 方法
跟进 connect 方法
此处通过 lookup 实现 ldap 请求
检测到 LDAP 请求
如果是LDAP请求,需要JDK版本<= 8u181
如果是RMI请求,需要JDK版本<= 8u112
那为什么会调用对应值set方法呢?尝试实验
先构造加载类
再构造Test类
通过输出分析发现 fastjson 的反序列化方法,parse 和 parseObject 类中
1、在调用 parseObject 方法时,会默认调用所有get方法,并调用传入参数的set方法
2、在调用 parse 方法时,只调用传入参数的set方法
所以可以通过 com.sun.rowset.JdbcRowSetImpl 类的 setDataSourceName 先进行赋值
再通过 com.sun.rowset.JdbcRowSetImpl 类的 autoCommit 方法去间接调用 connect 方法,去执行 lookup 方法执行 ladp 请求