初识SSTI(服务端模板注入攻击)

一、模板引擎(SST)

百度百科:

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档

原理:

模板引擎的实现方式有很多,最简单的是“置换型”模板引擎,这类模板引擎只是将指定模板内容(字符串)中的特定标记(子字符串)替换一下便生成了最终需要的业务数据(比如网页)。

置换型模板引擎实现简单,但其效率低下无法满足高负载的应用需求(比如有海量访问的网站),因此还出现了**“解释型”模板引擎和“编译型”**模板引擎等。

用途:

让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。

通俗的说,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。

何为渲染函数?

主要是render()函数

什么时候需要使用 render 函数呢?

答:当需要使用 JavaScript 来动态创建 HTML 模板时,可以使用 render 函数。

二、Server-Side Template Injection的原理

类比sql注入,SSTI也是获取了一个输入,然后在后端的渲染处理上进行了语句的拼接,然后执行。当然还是和sql注入有所不同的,SSTI利用的是现在的网站模板引擎,主要针对python、php、java的一些网站处理框架,比如

  • Python的jinja2 mako tornado django
  • php的smarty twig
  • java的jade velocity

当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。

危害:

可能导致敏感信息泄露、代码执行、GetShell 等问题

示例:

$twig = new Twig_Environment(new Twig_Loader_String());  // Twig是php里面的一个模板引擎
 
$output = $twig->render("Hello {$_GET['name']}");  // 将用户输入作为模版内容的一部分
 
echo $output;   //输出在网页上

输入payload:?name={{210}},拼接后就是hello {{210}},将会在在网页上显示: hello 20

攻击者不仅仅能插入 JavaScript 脚本,而且还可以通过{{ }}进行传递变量和执行简单的表达式

三、检测

如果服务端将用户的输入作为了模板的一部分,那么在页面渲染时也必定会将用户输入的内容进行模版编译和解析最后输出

简单来说,就是更改请求参数使之承载含有模板引擎语法的 Payload,通过页面渲染返回的内容检测承载的 Payload 是否有得到编译解析,有解析则可以判定含有 Payload 对应模板引擎注入,否则不存在 SSTI。

你可能感兴趣的:(基础漏洞)