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 请求

浙公网安备 33010602011771号