禁用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 進行聲明。

【----幫助網安學習,以下所有學習資料免費領!加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處理。

可以採取禁用文檔類型、禁用外部實體聲明、啓用安全處理、禁用實體引用擴展這四種方式去進行防範。

更多靶場實驗練習、網安學習資料,請點擊這裏>>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章