SSTI注入

引自 https://www.cnblogs.com/tiaopidejun/p/12357245.html

ssti注入又称服务器端模板注入攻击(Server-Side Template Injection),和sql注入一样,也是由于接受用户输入而造成的安全问题。

它的实质就是服务器端接受了用户的输入,没有经过过滤或者说过滤不严谨,将用户输入作为web应用模板的一部分,但是在进行编译渲染的过程中,执行了用户输入的恶意代码,造成信息泄露,代码执行,getshell等问题。

这个问题主要是出在web应用模板渲染的过程中,目前比较流行的渲染引擎模板主要有:smarty,twig,jinja2,freemarker,velocity

flask 中渲染的方法有两种:

render_template
render_template_string

render_template()是渲染文件的

render_template_string()是渲染字符串的

不正确的使用render_template_string()可能会引发SSTI

flask使用jinja2作为渲染引擎,在网站的根目录下templates文件夹用来存放html文件(模板文件)

{{}}在jinja2中作为变量包裹标识符,不仅可以传递变量同时也可以执行简单的表达式

SSTI文件读取/命令执行/文件包含

通过python的对象的继承来一步步实现文件读取和命令执行!!

方法:

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

重要的魔术方法

__class__  返回类型所属的对象
__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的

__subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__  类的初始化方法(找到重载过的__init__类(在获取初始化属性后,带wrapper的说明没有重载,寻找不带warpper的))
__globals__  对包含函数全局变量的字典的引用
__dict__ 保存类实例或对象实例的属性变量键值对字典
__bases__ 返回类型列表
__builtins__查看其引用

具体超详细解法见 https://bbs.ichunqiu.com/thread-47685-1-1.html

原文地址:https://www.cnblogs.com/buchuo/p/12559408.html