禁用XXE處理漫談
前言
近期準備面試題時,XXE漏洞防范措施(或者說修復方式)在一些文章中比較簡略,
故本文根據研究進行總結,作為技術漫談罷了。
簡述
XXE漏洞
XXE(XML外部實體注入),程序解析XML數據時候,同時解析了攻擊者偽造的外部實體。XML用途是為了跨平臺語言傳輸數據。常常用于WEB開發等
XXE漏洞攻防情況
通常來說,XML文檔生成時會常用到XXE和內部實體。因此開發團隊根據項目需求去進行防范XXE漏洞。
然而實際情況是,即使采取了防范措施(錯誤的方法),XXE漏洞仍然可以大行其道。
有一個案例,某開發團隊針對CVE-2018-20318漏洞進行了及時的修復,依照的是官方的修復方案:
禁止實體擴展引用,dbFactory.setExpandEntityReferences(false)
然而后續XXE漏洞仍然可以奏效,有師傅又提交了CVE漏洞。
最后有師傅總結正確的修復方法,如下

CVE-2018-20318修復
禁用XXE處理分析
根據上述所說,XXE漏洞的正確處理是尤為重要的。我們這里以Java為例,
并且應用偏向于JAXP API進行分析如何禁用XXE處理
禁用文檔類型
首先可以禁用文檔類型。實體通過XML 文檔的 DOCTYPE 進行聲明。
我們在進行安全開發規劃時,如確定不需要 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處理。
可以采取禁用文檔類型、禁用外部實體聲明、啟用安全處理、
禁用實體引用擴展這四種方式去進行防范。