環境參考第一個鏈接,直接用IDEA打開
編譯EvilObject.java成EvilObject.class
先看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類
f8會對傳入的payload做處理將_去掉,這是構造payload的關鍵一步。先處理_bytecodes
當處理_bytecodes時,f7跟進bytesValue
對傳進的做base64解碼處理,這就是為什么payload做base64編碼處理的原因
為什么_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時,也會把_去掉。
調用outputProperties屬性的get方法:
調用newTransformer類
調用TransformerImpl類,繼續f7跟進
調用getTransletInstance,為什么poc中的_name和_class不為null的原因如下,387行實例化了傳入了EvilObject.class類。
這里調用了EvilObject的構造函數,惡意代碼執行。
上面是漏洞調試分析,關於pop鏈執行的構成如下分析:
首先_bytecodes會傳入getTransletInstance方法中的defineTransletClasses方法,defineTransletClasses方法會根據_bytecodes字節數組new一個_class,_bytecodes加載到_class中,最后根據_class,用newInstance生成一個java實例:
觸發getTransletInstance,看誰調用這個類,alt+f7
在newTransformer中觸發了getTransletInstance方法,那問題又來了怎么觸發newTransformer?alt+f7
getOutputProperties會調用newTransformer,而fastjson會調用屬性的get方法,所以傳入_outputProperties導致此方法執行,完整的形成了pop鏈。
調用鏈如下:
參考鏈接:
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/