zoukankan      html  css  js  c++  java
  • [WesternCTF2018]shrine

    前言

    前几天学习了一下ssti漏洞的知识,现在急需一些题来熟悉这些知识,或许可能会学到更多的相关知识。

    解题

    那我们用buu上一题-shrine,我们先启动靶机。进入到环境,发现这个题目已经把源码直接给了我们。

    代码如下:

     1 import flask
     2 import os
     3 
     4 app = flask.Flask(__name__)
     5 
     6 app.config['FLAG'] = os.environ.pop('FLAG')//注册了一个名为FLAG的config,这里基本可以确定是flag。
     7 
     8 
     9 @app.route('/')
    10 def index():
    11     return open(__file__).read()
    12 
    13 
    14 @app.route('/shrine/<path:shrine>')//这里设置了shrine路由,这里可能会实现ssti
    15 def shrine(shrine):
    16 
    17     def safe_jinja(s)://jinja模板
    18         s = s.replace('(', '').replace(')', '')
    19         blacklist = ['config', 'self']//设置黑名单
    20         return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s//把黑名单的东西遍历并设为空
    21 
    22     return flask.render_template_string(safe_jinja(shrine))//进行模块渲染
    23 
    24 
    25 if __name__ == '__main__':
    26     app.run(debug=True)

    通过代码,我们可以想到是访问shrine路径,在shrine下利用用ssti漏洞,测试一下吧 shrine/{{7*7}} 

     发现7*7被计算出来了,这里就有ssti漏洞了

    接下来我们使用 {{config}} 查看一下配置文件,这样app.config也就可以看到了。不过在这道题当中设置了黑名单,过滤了 config 与 self ,不然我们可以使用config,传入 config,或者使用self传入 {{self.dict}},不过,这道题是不行了。但是在python里,有许多内置函数,其中有一个 url_for ,其作用是给指定的函数构造 URL。配合globals(),该函数会以字典类型返回当前位置的全部全局变量。这样也可以实现查看的效果

     shrine/{{url_for.__globals__}} 

    current_app': <Flask 'app'>这里的current就是指的当前的app,这样我们只需要能查看到这个的config不就可以看到flag了,那么构造payload

    shrine/{{url_for.__globals__['current_app'].config}}

     找到flag

  • 相关阅读:
    集合框架
    5.异常
    接口小结
    多态(3)面向对象的三大特征之三
    面向对象编程(1)继承
    第五章博客
    《MySQL数据库》MySQL集群工具mycat安装
    《MySQL数据库》MySQL分区表
    《MySQL数据库》MySQL读写分离(Atlas)
    《Redis内存数据库》Redis数据类型和基本操作
  • 原文地址:https://www.cnblogs.com/awsole/p/14595649.html
Copyright © 2011-2022 走看看