目录
1.1、简介:
(Server-Side Template Injection) 服务端模板注入
1、使用框架(MVC的模式),如python的flask,php的tp,java的spring等
2、用户的输入先进入控制器,导致服务器模板中拼接了恶意用户输入导致各种漏洞
3、根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取
4、通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式,并最后把结果返回给View视图层,展示给用户
1.2、成因:
1、使用模板来提高开发效率,同时带来了安全问题
2、配置代码不规范、未过滤用户输入的数据导致模板可控
3、服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分
4、模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题
1.3、原理:
简介:
配置的不正确的使用以及没有对用户输入的数据进行有效的过滤导致的
render_template
1、指定模板文件进行渲染,在模板文件可以使用相应的模板格式的语法,如{{}}
2、变量的引用,写入到一个静态文件当中(无法进行SSTI注入)
render_template_string
对一个字符串进行渲染,同样在遇到有符合模板语法的内容时会进行解析
eg:
render_template_string("
my old is {}".format(request.args.get('old')))
这里old是用户可控从url中传入的GET参数(符合模板语法格式,则被解析执行)
传入参数{{ 5*5 }}
会回显25
1.4、漏洞点:
使用模板的地方都可能出现 SSTI 漏洞,SSTI不只适用python
沙盒绕过是为所有的模板引擎设计出来的一种防护机制,不允许使用没有定义、声明的模块
1.5、利用:
基类–>子类–>危险函数
1、获取内置类所对应的类
__class__
2、拿到object基类
__bases__
3、获取子类列表
__subclasses__()
4、在子类中寻找可利用的类
2.1、简介:
即固定好格式,只需填充。
通过模块,实现逻辑与视图(界面与数据)分离,更容易、清楚且相对安全地编写前后端不同的逻辑,提升了开发效率,代码重用变得更加容易。
2.2、利用原理:
正常:用户输入作为 模板中变量(编码转义)
非正常:用户输入作为 模板的一部分(会被输出)
2.3、漏洞发现:
{% ... %} :声明变量
{{ ... }} :将表达式打印到模板输出
{# ... #} :未包含在模板输出中的注释
eg:
{{3*3}}
输出9
则存在漏洞点
3.1、简介:
使用python编写的一个轻量级的web应用框架,模板引擎使用的是jinja2,遵循MVC模型。
MVC模型:M(model)模型,V(view)视图,C(controler)控制器。
模型:数据库的定义、管理,通过视图向用户展现数据,通过控制器控制查询的操作
视图:用于进行信息交互,向用户进行信息的展示等
控制器:用户在接收到视图信息之后,向模型发送指令
3.2、jinja2:
jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用
4.1、_class_
作用:返回对象的类型
示例:
A='abc' print(A.__class__)
输出a的类型为str
4.2、_bases_
作业:返回对应的类的基类(即父类)
示例:
class A: __a='1'
class B(A): b='2'
print(B.__bases__)
输出B的父类A
4.3、_mro_
作用:给出解析方法调用的顺序
输出在解析方法的调用顺序是首先在自身类查看是否存在该方法→依次在继承的类中寻找→在所有类的积累object中寻找
4.4、_subclasses_()
作用:返回一个类的所有的子类
4.5、_globals_
作用:返回当前空间下能使用的模块、方法、变量
4.6、__init__
作用:类的初始化方法
4.7、__dict__
作用:保存类实例或对象实例的属性变量键值对字典
4.8、__getitem__
使用索引访问元素(用于过滤[]的情况)