前言
近期準備面試題時,XXE漏洞防範措施(或者說修復方式)在一些文章中比較簡略,故本文根據研究進行總結,作爲技術漫談罷了。
簡述
XXE漏洞
XXE(XML外部實體注入),程序解析XML數據時候,同時解析了攻擊者僞造的外部實體。XML用途是爲了跨平臺語言傳輸數據,常常用於WEB開發等。
XXE漏洞攻防情況
通常來說,XML文檔生成時會常用到XXE和內部實體。因此開發團隊根據項目需求去進行防範XXE漏洞。
然而實際情況是,即使採取了防範措施(錯誤的方法),XXE漏洞仍然可以大行其道。
有一個案例,某開發團隊針對CVE-2018-20318漏洞進行了及時的修復,依照的是官方的修復方案:
禁止實體擴展引用,dbFactory.setExpandEntityReferences(false)
然而後續XXE漏洞仍然可以奏效,有師傅又提交了CVE漏洞。
最後有師傅總結正確的修復方法,如下:
禁用XXE處理分析
根據上述所說,XXE漏洞的正確處理是尤爲重要的。我們這裏以Java爲例,並且應用偏向於JAXP API進行分析如何禁用XXE處理。
禁用文檔類型
首先可以禁用文檔類型。實體通過XML 文檔的 DOCTYPE 進行聲明。
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備註 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
我們在進行安全開發規劃時,如確定不需要 DOCTYPE 聲明時,可以完全禁用禁用文檔類型。
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
當我們設置爲true時,disallow-doctype-decl 使XML處理器發現DOCTYPE 聲明時拋出異常。
禁用外部實體聲明
其次是可以允許聲明DOCTYPE,但禁用外部實體聲明。
故若想要正常處理其他DTD聲明,只針對外部實體進行拋出異常。可以用下面兩種方法設置爲flase來處理:
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
補充說明:在PHP中,libxml庫默認下是安全的,總是禁用外部實體。除非通過設置LIBXML_NOENT參數進行允許。如下:
$doc = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOENT); // !XXE enabled!
$doc = simplexml_load_string($xml, "SimpleXMLElement"); // XXE disabled
啓用安全處理
在Java中可以使用Feature for Secure Processing (FSP)進行安全處理。如下:
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
FSP屬於一種核心Java機制,用於以應用限制去配置XML處理器,從而可以防範XML拒絕服務攻擊和XXE漏洞。
默認設置下,FSP處於部分啓用的狀態,XML拒絕服務攻擊可以防範。而XXE漏洞我們需要通過調用setFeature方法,將FSP由部分啓用轉爲完全啓用。
不過也有特例,例如Apache Xerces中FSP不限制外部連接,無法防範XXE漏洞。
總之,開發人員應當測試涉及XXE漏洞的FSP配置,並結合其他方式來禁用或者限制XXE。
禁用實體引用擴展
XML文檔中尋找實體引用主要有兩種方式:
(1)DOM XML解析器作值替換引用
(2)DOM樹創建空實體進行引用
將實體作值替換的機制在解析惡意XML文件時,可能會泄露敏感信息。
在Java中,對象DocumentBuilder中的etExpandEntityReferences方法用於配置實體引用:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setExpandEntityReferences(false);
當配置爲false時,不會進行實體引用。因而可以防範XXE漏洞。
擴展外部實體引用是發生在已提取外部內容之後。
因此禁用後且攻擊者無法造成泄露敏感數據,仍然執行請求外部資源。
不過經過禁用實體引用擴展,攻擊者僅能進行blind SSRF攻擊,難以實際造成威脅。
所以禁用實體引用擴展也是我們防範XXE漏洞的可選方案。
結束語
本文爲XXE漏洞相關的防範措施漫談,主要針對禁用XXE處理。
可以採取禁用文檔類型、禁用外部實體聲明、啓用安全處理、禁用實體引用擴展這四種方式去進行防範。
更多靶場實驗練習、網安學習資料,請點擊這裏>>