0x01 前言
在前面的文章中介紹了基于CC鏈的反序列化利用方式,并且通過最終調(diào)用Runtime類的exec方法達到命令執(zhí)行的效果。在CC鏈中還可以通過xalan來執(zhí)行命令。
xalan是java操作xml的庫,屬于java內(nèi)置的官方庫之一,在CC鏈中主要用到的是com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl類。與上篇文章中提到的利用鏈不同,xalan最終是通過加載字節(jié)碼來達到代碼執(zhí)行的效果,所以xalan更適合于執(zhí)行語句的場景,利用xalan來植入內(nèi)存馬會比其他鏈更加方便。如果目標同時可以使用多條CC鏈,通常會更傾向于使用xalan相關(guān)的鏈。
往期推薦
1
告別腳本小子系列丨JAVA安全(1)——JAVA本地調(diào)試和遠程調(diào)試技巧
2
告別腳本小子系列丨JAVA安全(2)——JAVA反編譯技巧
3
告別腳本小子系列丨JAVA安全(3)——JAVA反射機制
4
告別腳本小子系列丨JAVA安全(4)——ClassLoader機制與冰蝎Webshell分析
5
告別腳本小子系列丨JAVA安全(5)——序列化與反序列化
6
告別腳本小子系列丨JAVA安全(6)——反序列化利用鏈(上)
7
告別腳本小子系列丨JAVA安全(7)——反序列化利用鏈(中)
0x02 Xalan鏈分析
java.lang.ClassLoader是java中負責類加載的抽象類,類中包含一個特別重要的方法defineClass,defineClass方法接受一組字節(jié),然后將其具體化為一個Class類型實例,它一般從磁盤上加載一個文件,然后將文件的字節(jié)傳遞給JVM,通過JVM(native 方法)對于Class的定義,將其具體化,實例化為一個Class類型實例。目前流行的jsp的webshell冰歇和哥斯拉均是采用這種方式來傳遞的惡意代碼。
在TemplatesImpl類的defineTransletClasses方法中,存在對defineClass方法的調(diào)用,如圖2.1所示。并且傳遞的參數(shù)來源于類私有的屬性_bytecodes。
圖2.1 在defineTransletClasses方法中調(diào)用defineClass方法
除了通過defineClass來生成Class對象之外,還需要通過newInstance方法來生成類對應(yīng)的實例。向上查找調(diào)用了defineTransletClasses方法的其他方法,如圖2.2所示。
圖2.2 在getTransletInstance方法中調(diào)用了目標方法,并進行實例化
由于getTransletInstance方法是private類型的方法,不利于在反序列化利用鏈中進行調(diào)用,繼續(xù)向上查找調(diào)用了getTransletInstance方法的其他方法,如圖2.3所示。
圖2.3 通過newTransformer方法調(diào)用getTransletInstance方法
這里的newTransformer方法已經(jīng)是一個public類型的方法了,可以直接在反序列化利用鏈中進行調(diào)用。但是在TemplatesImpl類中還存在對newTransformer方法調(diào)用的另外的方法,如圖2.4所示。
圖2.4 通過getOutputProperties方法調(diào)用newTransformer方法
在TemplatesImpl類中提供了通過defineClass動態(tài)加載字節(jié)碼并進行實例化的方式,這是TemplatesImpl類能夠在多種不同類型反序列化利用鏈中出現(xiàn)的根本原因。并且由于自身內(nèi)部方法間相互調(diào)用的關(guān)系,可以總結(jié)只要滿足下面表的條件之一,則可以達到通過TemplatesImpl類執(zhí)行命令的效果。
表2.1 TemplatesImpl類提供的調(diào)用方式
在TemplatesImpl類中調(diào)用對應(yīng)的方法,可以達到命令執(zhí)行的效果,如圖2.5所示。方法一和方法二均能達到一樣的命令執(zhí)行效果。
圖2.5 通過TemplatesImpl來執(zhí)行命令
0x03 基于Xalan的CC鏈
在CC3的利用鏈中最終是通過Xalan來執(zhí)行命令,CC3的利用鏈和通過com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter類的構(gòu)造方法來調(diào)用newTransformer方法,達到通過Xalan執(zhí)行命令的效果,如圖3.1所示。
圖3.1 在TrAXFilter類的構(gòu)造方法中調(diào)用newTransformer方法
下一步的關(guān)鍵是看如何調(diào)用TrAXFilter類的構(gòu)造方法,ysoserial的作者并沒有直接找TrAXFilter類的構(gòu)造方法調(diào)用,而是通InstantiateTransformer類的transform方法中存在調(diào)用任意類的getConstructor方法來調(diào)用TrAXFilter類。如圖3.2所示。
圖3.2 在InstantiateTransformer類的transform方法中調(diào)用TrAXFilter類的構(gòu)造方法?
剩下如何調(diào)用InstantiateTransformer類的transform方法與CC1利用鏈完全一致,如圖3.3所示。這里不對其中完全一致的內(nèi)容再做分析。
圖3.3 CC3利用鏈和CC1利用鏈對比文章來源:http://www.zghlxwxcb.cn/news/detail-516462.html
除了CC3的鏈以外,還有CC2、CC4、CB鏈均與Xalan有關(guān),Xalan提供了一種執(zhí)行復(fù)雜語句的方式,掌握Xalan鏈有助于編寫高級復(fù)雜的反序列化利用代碼。文章來源地址http://www.zghlxwxcb.cn/news/detail-516462.html
到了這里,關(guān)于告別腳本小子系列丨JAVA安全(8)——反序列化利用鏈(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!