Loading

SSTI

https://portswigger.net/web-security/server-side-template-injection

简介

SSTI 全称 Server-side template injection ,服务端模板注入

什么是模板、SSTI

模板引擎被设计用来将可变的数据插入到固定的页面模板中以生成 web 页面。此处的模板指的是 JavaScript template 。其是用来减少工作量、简化开发,用来生成 除数据外页面结构相同的 web 页面。

当用户输入直接被插入到模板中,而不是以值的形式传进去,则会导致攻击者可以注入任意的模板指令。

例如有如下的 PHP 代码,其中 twig 为php 的模板引擎。

# 参数以值的形式传递,不存在该漏洞
$output = $twig->render("Dear {first_name},", array("first_name" => $user.first_name) );
# 参数直接插入到模板中,存在 SSTI
$output = $twig->render("Dear ".$_GET['name']);

# 利用方式
http://vulnerable-website.com/?name={{bad-stuff-here}}

可以看到,该漏洞产生原理和 SQL 注入 相像,都是用户输入参数未作处理,直接当作指令的一部分执行。

是否使用预编译

CSTI & SSTI

根据最终模板代码执行位置的不同,模板注入分为服务端模板注入和客户端模板注入。

漏洞危害

该漏洞最终危害就是执行任意的模板代码。

同样是执行 js 代码,服务端的 js 危害更大。

但通常受限于不同模板引擎的规则,造成的影响也不同,例如绝大多数模板引擎都默认存在沙箱安全机制。

如何攻击

  1. 检测是否存在模板注入的漏洞
  2. 识别服务端使用何种模板引擎,因为不同的模板引擎语法不同。
  3. 进行利用

自动化工具 tplmap https://github.com/epinna/tplmap

效果一般,识别能力不太行,用来利用还不错。

如何防御

攻击

payload 参考:https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection

检测是否存在模板引擎

对参数进行fuzz ${{<%[%'"}}%\

对可疑的输入参数进行审计。

检测

在管理界面有修改显示名的功能,而实际展现修改后的效果,是在另一个页面触发。

利用

查询官方文档,寻找敏感功能,进行利用。

posted @ 2022-03-26 17:23  沉云  阅读(194)  评论(0编辑  收藏  举报