[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