fastjson 1.2.24 反序列化漏洞(审计分析)

发布时间 2023-04-14 16:40:19作者: Tanya203

环境

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