[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提到的一个点:

? https://i.blackhat.com/USA-19/Thursday/us-19-Birch-HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization.pdf

? 逐步学习下,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的主要内容,如果未能解决你的问题,请参考以下文章

WEB|[SUCTF 2019]Pythonginx

BUUCTF:[SUCTF 2019]Pythonginx

BUUCTF:[SUCTF 2019]Pythonginx

BUUCTF:[SUCTF 2019]Pythonginx

[SUCTF 2019]Pythonginx

[SUCTF 2019]Pythonginx(Idna与utf-8编码漏洞)