fastjson反序列化TemplatesImpl


環境參考第一個鏈接,直接用IDEA打開

編譯EvilObject.java成EvilObject.class
Alt text
先看poc,其中NASTY_CLASS為TemplatesImpl類,evilCode是EvilObject.class base64編碼:

final String evilClassPath = "E:\\Struts2-Vulenv-master\\PoCs-fastjson1241\\src\\main\\java\\org\\lain\\poc\\TemplatesImpl\\EvilObject.class";
        String evilCode = readClass(evilClassPath);
        final String NASTY_CLASS = "Lcom.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;";
 String payload = "{\"@type\":\"" + NASTY_CLASS +
"\",\"_bytecodes\":[\""+evilCode+"\"],'_name':'a.b','_tfactory':{ },\"_transletIndex\":0,\"_auxClasses\":{},\"_outputProperties\":{ }";

下面看下Poc是怎么構造的,當使用fastjson解析json時,會自動調用其屬性的get方法。
TypeUtil.clss 813行下斷點,會加載TemplatesImpl類
Alt text
f8會對傳入的payload做處理將_去掉,這是構造payload的關鍵一步。先處理_bytecodes
Alt text
當處理_bytecodes時,f7跟進bytesValue
Alt text
對傳進的做base64解碼處理,這就是為什么payload做base64編碼處理的原因
Alt text
為什么_tfactory為{}?

fastjson只會反序列化公開的屬性和域,而com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中_bytecodes卻是私有屬性,_name也是私有域,所以在parseObject的時候需要設置Feature.SupportNonPublicField,這樣_bytecodes字段才會被反序列化。_tfactory這個字段在TemplatesImpl既沒有get方法也沒有set方法,這沒關系,我們設置_tfactory為{ },fastjson會調用其無參構造函數得_tfactory對象,這樣就解決了某些版本中在defineTransletClasses()用到會引用_tfactory屬性導致異常退出。

當處理_outputProperties時,也會把_去掉。
Alt text
調用outputProperties屬性的get方法:
Alt text
調用newTransformer類
Alt text
調用TransformerImpl類,繼續f7跟進
Alt text
調用getTransletInstance,為什么poc中的_name和_class不為null的原因如下,387行實例化了傳入了EvilObject.class類。
Alt text
這里調用了EvilObject的構造函數,惡意代碼執行。
Alt text
上面是漏洞調試分析,關於pop鏈執行的構成如下分析:
首先_bytecodes會傳入getTransletInstance方法中的defineTransletClasses方法,defineTransletClasses方法會根據_bytecodes字節數組new一個_class,_bytecodes加載到_class中,最后根據_class,用newInstance生成一個java實例:
Alt text
觸發getTransletInstance,看誰調用這個類,alt+f7
Alt text
在newTransformer中觸發了getTransletInstance方法,那問題又來了怎么觸發newTransformer?alt+f7
Alt text
getOutputProperties會調用newTransformer,而fastjson會調用屬性的get方法,所以傳入_outputProperties導致此方法執行,完整的形成了pop鏈。
Alt text
調用鏈如下:
Alt text
參考鏈接:
https://github.com/ZH3FENG/PoCs-fastjson1241.git
這篇文章寫得最好
https://p0sec.net/index.php/archives/123/
http://xxlegend.com/2017/04/29/title-%20fastjson%20%E8%BF%9C%E7%A8%8B%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96poc%E7%9A%84%E6%9E%84%E9%80%A0%E5%92%8C%E5%88%86%E6%9E%90/
https://paper.seebug.org/636/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM