一,服务器端模板注入(SSTI,Sever-side Template injection)
相关知识:
1.模版语言
定义:
模版语言背后的前提是语言在其他文档中“嵌入”。一些模版语言是完整的通用语言,比如PHP,ASP.NET和Java的JSP。也有其他的更专门用于模板化,例如:Velocity和FreeMaker(Java的两个实用程序)。许多文字处理器都有自己的模板功能。通常被称为“邮件合并”。
作用:
封装代码,提高代码的可用性。
2.模板引擎
(这里特指用于Web开发的模板引擎)
是为了是用户界面与业务数据分离而产生,可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。
拓展:模版引擎也会提供沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术来进行绕过。
SSTI
当前使用的一些框架,比如java的spring,python的flask,php的tp等一般都采用成熟的MVC模式。用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送到对应的Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过末班渲染显示给用户。
产生漏洞的原因:服务端接收到了用户的恶意输入以后,未经任何处理就将,其作为Web应用模板内容的一部分。然后模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏末班的语句,因而可能导致敏感信息的泄露,代码执行,GetShell等问题。其影响范围主要取决于模版引擎的复杂性。
所以凡是使用模板的地方都可能出现SSTI问题。SSTI不属于任何一种语言,沙盒绕过也不是。沙盒绕过是由于模板引擎发现了很大的安全漏洞然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,适用于所有的模板引擎。