引文
上篇文章带来了反序列化漏洞的知识,还没讲过的基础漏洞类型已经很少了,今天给大家带来的知识点是SSTI模板注入,提到注入大家首先想到的肯定是SQL注入,而SSTI模板注入和SQL注入其实也存在着类似的点,接下来就详细给大家讲解一下。
简介
服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。
原理
我们先引入一下服务器模板,页面上的数据需要不断更新,即为渲染。我们简单举一个例子:使用 Twig 模版引擎渲染页面,其中模版含有 {
{name}}
变量,其模版变量值来自于 GET 请求参数 $_GET["name"]
,如果渲染的模版内容受到用户的控制,代码如下:
$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {$_GET['name']}");// 将用户输入作为模版内容的一部分
echo $output;
可以看到上面就是个漏洞点,服务端相信了用户的输出。
SSTI类型
根据模板类型的不同,包裹变量的标识符也大有不同,我们常见的模板引擎有,我们可以根据返回值的类型来判断不同的模板引擎。可以根据下图来进行判断:
基础语法
class:查看变量所属的类,根据前面的变量形式可以得到其所属的类。
>>> ''.__class__
<class 'str'>
>>> ().__class__
<class 'tuple'>
>>> {}.__class__
<class 'dict'>
>>> [].__class__
<class 'list'>
bases:查看类所属的基类
>>> ''.__class__.__bases__
(<class 'object'>,)
>>> ().__class__.__bases__
(<class 'object'>,)
>>> {}.__class__.__bases__
(<class 'object'>,)
>>> [].__class__.__bases__
(<cla