码迷,mamicode.com
首页 > 其他好文 > 详细

[WesternCTF2018]shrine

时间:2020-04-14 12:43:59      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:__file__   变量   方法   strong   pytho   oba   flask   current   message   

又是SSTI模板注入类题目
源代码如下:

import flask
import os

app = flask.Flask(__name__)

app.config[‘FLAG‘] = os.environ.pop(‘FLAG‘)


@app.route(‘/‘)
def index():
    return open(__file__).read()


@app.route(‘/shrine/<path:shrine>‘)
def shrine(shrine):

    def safe_jinja(s):
        s = s.replace(‘(‘, ‘‘).replace(‘)‘, ‘‘)
        blacklist = [‘config‘, ‘self‘]
        return ‘‘.join([‘{{% set {}=None%}}‘.format(c) for c in blacklist]) + s

    return flask.render_template_string(safe_jinja(shrine))


if __name__ == ‘__main__‘:
    app.run(debug=True)

代码中给出了两个路由,第一个是用来显示源代码的

第二个路由在/shrine/路径下提交参数,模板中设定{{ }}包括的内容为后端变量,% %包括的内容为逻辑语句

简单测试
技术图片
技术图片
在没有黑名单过滤的情况下

我们可以使用config,传入 config,或者使用self传入 {{self.dict}}

当config,self,()都被过滤的时候,为了获取讯息,我们需要读取一些例如current_app这样的全局变量。python的沙箱逃逸这里的方法是利用python对象之间的引用关系来调用被禁用的函数对象。

这里有两个函数包含了current_app全局变量,url_for和get_flashed_messages

我们注入{url_for.globals}得到

技术图片
继续注入当前app的config

{url_for.globals[‘current_app‘].config}得到

技术图片

[WesternCTF2018]shrine

标签:__file__   变量   方法   strong   pytho   oba   flask   current   message   

原文地址:https://www.cnblogs.com/buchuo/p/12696854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!