一、关于SSTI
SSTI(Server Side Template Injection),又称服务端模板注入攻击。其发生在MVC框架中的view层,常见的用于渲染的模板有Twig、FreeMarker、Velocity、Smarty等。
服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、getShell 等问题。
例如twig的代码:
$output =$twig->render($_GET['custom_email'], array("first_name" =>$user.first_name) );
如果我们输入custom_email={ {7*7}}则会得到49。关于SSTI漏洞的介绍可见:
https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf
二、关于Jinja2
Jinja2 是仿照 Django 模板的一个功能齐全的模板引擎。它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
编写示例代码一,将请求输入参数name拼接为模板内容的一部分并进行渲染输出,这里关注Template模块的render方法:
(注:request.url的方式不能导致模板注入了,在最新的flask版本中会自动对request.url进行urlencode,request.args传参)
三、漏洞复现
访问如下链接,被解析成功,说明漏洞的存在:
http://127.0.0.1:5000/?name={ {22*3}}
而SSTI中主要涉及的漏洞有两个:文件读取和命令执行,这里主讲命令执行。
首先python环境下常用的命令执行方式有以下几种:
os.system()os.po