zoukankan      html  css  js  c++  java
  • [SUCTF 2019]Pythonginx

    贴出源码

     1         @app.route('/getUrl', methods=['GET', 'POST'])
     2 def getUrl():
     3     url = request.args.get("url")
     4     host = parse.urlparse(url).hostname
     5     #解析url,赋值hostname
     6     if host == 'suctf.cc':
     7         return "我扌 your problem? 111"
     8     parts = list(urlsplit(url))
     9     #list() 方法用于将元组转换为列表。
    10     #parse.urlprase方法    将url分为6个部分,返回一个包含6个字符串项目的元组:协议、位置、路径、参数、查询、片段。
    11     #ParseResult(scheme='https', netloc='i.cnblogs.com', path='/EditPosts.aspx', params='', query='opt=1', fragment='')
    12     #其中 scheme 是协议  netloc 是域名服务器  path 相对路径  params是参数,query是查询的条件
    13     host = parts[1]
    14     if host == 'suctf.cc':
    15         return "我扌 your problem? 222 " + host
    16     newhost = []
    17     for h in host.split('.'):
    18         # split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串,返回分割后的字符串列表。
    19         newhost.append(h.encode('idna').decode('utf-8'))
    20         #append()方法用于将传入的对象附加(添加)到现有列表中。
    21     parts[1] = '.'.join(newhost)
    22     #Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
    23 
    24     #去掉 url 中的空格
    25     finalUrl = urlunsplit(parts).split(' ')[0]
    26     host = parse.urlparse(finalUrl).hostname
    27     if host == 'suctf.cc':
    28         return urllib.request.urlopen(finalUrl).read()
    29     else:
    30         return "我扌 your problem? 333"

    关键代码在第19行

      newhost.append(h.encode('idna').decode('utf-8'))

    这里将域名每个部分进行idna编码后,再utf-8解码

    利用点转码上的问题

    这个漏洞在2019black hat进行了讨论

    参考链接:

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

    https://www.cnblogs.com/cimuhuashuimu/p/11490431.html

    漏洞产生的原因是各国语言的编码形式在进行转换时,会以不同的形式呈现,导致可以构造可以利用的恶意url

    根据代码审计

    我们需要绕过前两个if判断,进入第三个if判断去利用read()函数

    简单来说就是

    在前两个判断时不能是suctf.cc

    第三个是suctf.cc

    利用方式:

    题目告诉了我们使用的是nginx

    所以去读nginx配置文件

    字符℆ 在后台转码会解析为c/u

    由此我们可以构造payload如下

    payload:

    file://suctf.c℆sr/local/nginx/conf/nginx.conf


    http://d7844ab4-68f7-4e76-9432-a112b65afa1f.node3.buuoj.cn/getUrl?url=file://suctf.c%E2%84%86sr/fffffflag

     

           

  • 相关阅读:
    linux find命令
    busybox的使用
    sql server的数据库个数、表个数及表的数据量统计
    SQL Server查看所有表大小,所占空间
    oracle数据库审计
    oracle --审计
    oracle 增量导出/导入
    MySQL下做Master/Slave同步,延迟太大怎么办?
    【MongoDB】2、安装MongoDB 2.6.1 on Unbuntu 14.04(学习流水账)
    mongodb shell之使用js(二)
  • 原文地址:https://www.cnblogs.com/Chr1sto/p/12289416.html
Copyright © 2011-2022 走看看