[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

原文地址:https://www.cnblogs.com/awsole/p/14595649.html