1. 程式人生 > >fastjson反序列化TemplatesImpl

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/