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 的例子如下。

因此可以通过版权符号来绕过第一层和第二层的绕过并且又符合 host 名为 suctf.cc 。又因为题目中包含提示 Do you know the nginx 故需要从 nginx 的相关文件中来找 flag ,最后可以在 /usr/local/nginx/conf/nginx.conf 中找到相关信息,Payload 以及回显如下所示。

通过构造以下 Payload 即可得到 flag 。

Last updated