Flask模板注入小结
目录#
简介#
SSTI(Server-Side Template Injection),即服务端模板注入攻击,通过与服务端模板的输入输出交互,在过滤不严格的情况下,构造恶意输入数据,从而达到读取文件或者getshell的目的,目前CTF常见的SSTI题中,大部分是考python的。
基础知识
模板语法#
|
|
魔术方法#
|
|
常规逃逸#
|
|
内置函数#
介绍#
flask提供了两个内置的全局函数:url_for、get_flashed_messages,两个都有__globals__键;
jinja2一共有3个内置的全局函数:range、lipsum、dict,其中只有lipsum有__globals__键
条件
flask的内置函数只有flask的渲染方法render_template()和render_template_string()渲染时才可使用;
jinja2的内置函数无条件,flask和jinja2的渲染方法都可使用
payload#
|
|
内置类#
Undefined#
介绍#
在渲染().__class__.__base__.__subclasses__().c.__init__初始化一个类时,此处由于不存在c类理论上应该报错停止执行,但是实际上并不会停止执行,这是由于Jinja2内置了Undefined类型,渲染结果显示为<class 'jinja2.runtime.Undefined'>,所以看起来并不存在的c类实际上触发了内置的Undefined类型。
payload
|
|
bytes#
例题:xctf_huaweicloud-qualifier-2020/web/mine2
介绍#
python3新增了bytes类,用于代表字符串,其fromhex()方法可以将十六进制转换为字符串。
payload#
|
|
bypass#
字符串过滤#
|
|
符号过滤#
|
|
编码绕过#
|
|
request方法#
|
|
原理有限,姿势无限,希望看到更多带佬的骚姿势(*^_^*)
参考#
关于Flask SSTI,解锁你不知道的新姿势https://mp.weixin.qq.com/s/Uvr3NlKrzZoWyJvwFUFlEA)