eg1:
@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] # 将主机名再次组合成 url host = parse.urlparse(finalUrl).hostname if host == 'suctf.cc': return urllib.request.urlopen(finalUrl).read() else: return "我扌 your problem? 333"
前两个 if 判断 host是否含有 suctf.cc 如果有就报错,经过 utf-8 解码 idna 编码 之后传入到 urlunsplit函数 组合成url ,再用 if 和suctf.cc进行一次比较 如果相同 就 进行读取。
方法一:
可以利用urlsplit不处理NFKC标准化进行文件读取:
?url=file:////suctf.cc/etc/passwd
方法二:
先了解下idna
我们先了解下 idna idna 国际化域名应用,国际化域名(Internationalized Domain Name,IDN)又名特殊字符域名,是指部分或完全使用特殊文字或字母组成的互联网域名,包括中文、发育、阿拉伯语、希伯来语或拉丁字母等非英文字母,这些文字经过多字节万国码编码而成。在域名系统中,国际化域名使用punycode转写并以 ASCII字符串存储。 . ℆这个字符,如果使用python3进行idna编码的话 print(‘℆’.encode(‘idna’)) 结果 b’c/u’ 如果再使用utf-8进行解码的话 print(b’c/u’.decode(‘utf-8’)) 结果 c/u 通过这种方法可以绕过本题View Code
可以通过以下方法读取文件
?url=file://suctf.c℆sr/local/nginx/conf/nginx.conf
参考链接:
[SUCTF 2019]Pythonginx 1_cve-2019-9636-CSDN博客
[SUCTF 2019]Pythonginx 1_hcjtn的博客-CSDN博客
标签:审计,suctf,04,python,域名,url,host,idna,cc From: https://www.cnblogs.com/yiyajinluo/p/17875670.html