環境
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 請求
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/550151.html
標籤:其他
上一篇:看了幾集狂飆,大佬說我變了?
下一篇:故障注入的方法與工具
