[SUCTF 2019]Pythonginx
Posted keelongz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SUCTF 2019]Pythonginx相关的知识,希望对你有一定的参考价值。
题目一览
进去,给了源码:
还有个提交框,以GET方式提交:
代码审计吧。
@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"
逻辑是:
接受一个URL,经过两次URL解析,不能是suctf.cc
第三次编码传入,经过一次编码+处理空格之后,判断是否为suctf.cc,是的话才执行URL。
P1 URL的Unicode解析漏洞
? 这道题的考点是黑帽大会2019提到的一个点:
? 逐步学习下,PPT给了这个一个例子:
这是URL??还真是:
如果给URL传入了了Unicode,也是可以解析的:会把Unicode往ASCII上进行转换。
步骤一共有两步:
1.归一化(Normalization)
2.Punycoding
第一步:归一化,说白了就是给一些Unicode字符统一标准:
这里引入一个概念:IDNA。
引入Unicode到ASCII,是为了解析带Unicode的域名——国际域名(IDN),为了向下兼容纯ASCII的DNS,而IDNA就是这个过程的重要一步:会先给Unicode初步加工,如果加工后有直接可以打印的ASCII,不在进行Punycoding。否则进入第二步:
第二步:Punycoding,把经过IDNA编码处理后的Unicode,按字符集Punycode转成ASCII:
说白了就是把Unicode转写成可打印的ASCII。这里给出了一个例子:
我们理一下整个思路:
Unicode ---- IDNA -----ASCII(Punnycode编码)
也就是源码中的这一步:newhost.append(h.encode(‘idna‘).decode(‘utf-8‘))
问题就出现在了这里,还记着第一步IDNA吗?如果加工后有直接可以打印的ASCII,不在进行Punycoding。
对于URL,有些Unicode就派上了用场:
? 这些Unicode:? ? ℅ ?
都可以被直接解析成a/c a/s c/a c/u
的形式:
有没有感觉和这道题源码很像??
所以我们只要传这样一个Unicode,拼接我们的URL就行了,因为前两步的URL解析并不会对Unicode进行IDNA解析。
我们使用这个Unicode:?
构造一个file协议读取文件试一试:
file://suctf.c?/../../../etc/passwd
成功:
P2 nginx敏感文件读取
题目既然提了ngnix,那么了解一下ngnix一些重要的目录:
配置文件存放目录:/etc/nginx 或 usr/local/nginx(默认安装目录)
主配置文件:/etc/nginx/conf/nginx.conf 或 usr/local/nginx
管理脚本:/usr/lib64/systemd/system/nginx.service
模块:/usr/lisb64/nginx/modules
应用程序:/usr/sbin/nginx
程序默认存放位置:/usr/share/nginx/html
日志默认存放位置:/var/log/nginx
我们读一下主配置文件试试,这里发现他在默认安装目录下:
file://suctf.c?/etc/nginx/conf/nginx.conf
那么直接读flag即可:
file://suctf.c?/usr/fffffflag
成功获得flag:
以上是关于[SUCTF 2019]Pythonginx的主要内容,如果未能解决你的问题,请参考以下文章