web安全/滲透測試--24--XXE外部實體注入
1、漏洞描述:
XXE Injection即XML External Entity Injection,也就是XML外部實體注入攻擊。漏洞是在對非安全的外部實體資料進行處理時引發的安全問題。
在XML1.0標準裡,XML文件結構裡定義了實體(entity)這個概念。實體可以通過預定義在文件中呼叫,實體的識別符號可訪問本地或遠端內容。如果在這個過程中引入了“汙染”源,在對XML文件處理後則可能導致資訊洩漏等安全問題。
藉助XXE,攻擊者可以實現任意檔案讀取,DOS拒絕服務攻擊以及代理掃描內網等。對於不同XML解析器,對外部實體有不同處理規則,在PHP中預設處理的函式為: xml_parse和simplexml_load。xml_parse的實現方式為expat庫,預設情況不會解析外部實體,而simplexml_load預設情況下會解析外部實體,造成安全威脅。除PHP外,在Java,Python等處理xml的元件及函式中都可能存在此問題。
2、檢測條件:
會解析外部實體的情況下(即使用了可解析外部實體的函式)。
3、檢測方法
XML中entity的定義語法為:
<!DOCTYPE filename
[
<!ENTITY entity-name "entity-content"
]>
如果要引用一個外部資源,可以藉助各種協議幾個例子:
file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
故構造簡單的Payload模型如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]> #SYSTEM是關鍵字
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
攻擊方案有如下幾種:
1、拒絕服務
POC中中先定義了lol實體,值為”lol”的字串,後在下面又定義了lol2實體,lol2實體引用10個lol實體,lol3又引用了10個lol2實體的值,依此類推,到了最後在lolz元素中引用的lol9中,就會存在上億個”lol”字串此時解析資料時未做特別處理,即可能造成拒絕服務攻擊。
此外還有一種可能造成拒絕服務的Payload,藉助讀取/dev/random實現。
2、內網資訊
藉助各種協議如http,XXE可以協助掃描內網,可能可以訪問到內網開放WEB服務的Server,並獲取其他資訊。
3、檔案讀取
最常規也是最有效的利用思路
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY>
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]
>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
4、修復方案
1、檢查所使用的底層xml解析庫,預設禁止外部實體的解析
2、使用第三方應用程式碼及時升級補丁
3、同時增強對系統的監控,防止此問題被人利用 對於PHP,由於simplexml_load_string函式的XML解析問題出在libxml庫上,所以載入實體前可以呼叫這樣一個函式
<?php
libxml_disable_entity_loader(true);
?>
//以進行防護,對於XMLReader和DOM方式解析,可以參考以下程式碼:
<?php
$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
$dom = new DOMDocument();
$dom -> loadXML($badXml,LIBXML_DTDLOAD | LIBXML_DTDATTR);
?>