CTF-flask模板注入学习
- 2021 年 8 月 23 日
- 筆記
今天又看到了一道这样的题,之前一直都学不明白的东西
反反复复给你看的时候,就想搞明白了。
我们做题的,需要知道flask是怎么运行的就行了。
这个就是一个最简单的flask应用,当我们访问的时候,就会显示hello world的字样。
flask之所以安全是因为他是靠渲染的flask的渲染方法有render_template和render_template_string两种。
大的不用懂,我们这样理解,写一个py文件,来带动html来显示页面就行。
和正常的html不同的是,这个页面是靠py文件来驱使的。
但这个时候,我们就又迷糊了,如果html要传个参数什么的,该怎么写?
就是这样。
重点就是{{}}在Jinja2中作为变量包裹标识符。
模板注入
不正确的使用flask中的render_template_string方法会引发SSTI。
这个code是用户可控的,那就可以传入xss代码和后面的html代码拼接,造成xss。
但是我们改一下
这样把我们传的参数放入 render_template_string中。就会被默认转义了。
了解了漏洞形成的原因,但是我们怎么在CTF利用中。
遇到ssti就先传参,看看什么模板
再看看这道题
我去。。拉了拉了,看不明白了。
一个个看吧。
app.config[‘FLAG’] = os.environ.pop(‘FLAG’),这样的话{{config}}可查看所有app.config内容,但是config被加入了黑名单,但是在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。
代码将 () 替换为空字符,还把config和self加入了黑名单。
return返回的就是你的参数给你做了一些限制后的参数
config 对象:
config 对象就是Flask的config对象,也就是 app.config 对象。
{{ config.SQLALCHEMY_DATABASE_URI }}
虽然有过滤但python还有一些内置函数,比如url_for和get_flashed_messages
url_for()作用:
(1)给指定的函数构造 URL。
(2)访问静态文件(CSS / JavaScript 等)。 只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。
get_flashed_messages方法: 返回之前在Flask中通过 flash() 传入的信息列表。
再找到可以利用的内置函数,直接冲就行了。