1. 程式人生 > >web安全/滲透測試--24--XXE外部實體注入

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);
?>