模板注入漏洞和常见的Web注入的成因相似,具备巨大的杀伤力,但因其模板引擎众多因此利用办法不一,故在此作一总结,文章逻辑图以下:
一、 模板引擎介绍
1.1 模板引擎介绍
在MVC的设计模式下,通常从 Model 层中读取数据,而后将数据传到 View 层渲染(渲染成 HTML 文件),而 View 层通常都会用到模板引擎。html
模板引擎包含了各类参数,并可以由模板处理系统经过识别某些特定语法来替换这些参数的文档,用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)。前端
模板专一于如何展示数据,而在模板以外能够专一于要展现什么数据。模板引擎可让网站程序实现界面与数据分离,业务代码与逻辑代码分离,这样提高了开发效率,良好的设计也使得代码重用变得更加容易。vue
1.2 模板引擎分类
模板引擎分为服务端和客户端:sql
1) 客户端模板引擎:主要结合js实现html,一种是常规字符串模板引擎,包括doT.js、dust.js、mustache.js;另外一种是Dom模板引擎,包括vue.js、Angular.js、React.js等。shell
2) 服务端模板引擎:由各服务端语言生成html返回客户端,主要包括:
PHP:Smarty、Twig;后端
Java:Freemarker、Velocity;设计模式
Python:Jinja2、Tornado、Marko;浏览器
Ruby:Slim、ERB;安全
NodeJS:Jade等服务器
1.3 模板引擎渲染原理
1)后端模板引擎
以JSP为例:
上方 <%%>内的是Java代码,为模板内容、<div></div> 是页面内容
当JSP在服务端运行被编译为Servlet Class后, <div></div> 被加引号成为字符串,输出字符串内容,须要在服务端运行。
2)前端模板引擎
前端模板引擎依赖客户端,在浏览器渲染页面,而不依赖于服务端。
2、漏洞概述
2.1 模板注入漏洞介绍
任何一项新技术的引入同时也会带来新的攻击方式。除了常规的 XSS 外,注入到模板中的代码还有可能引起 RCE(远程代码执行)。一般来讲,这类问题会在博客,CMS,wiki 中产生。虽然模板引擎自己会提供沙箱机制,但攻击者依然有许多手段绕过它。
看一个销售软件的例子,业务场景中要求发送大量的邮件给客户,并在每封邮件前插入问候语:
这段代码的功能是,经过Twig模板引擎能够把输入转换成特定的HTML文件或者email格式进行相应输出。
很明显咱们会发现代码存在xss,但问题不止如此,若是咱们输入custom_email={{7*7}},$output结果为49,这种探测方式和SQL注入也极为相似,原理也都是将未过滤的数据传给引擎解析。
2.2 攻击手法及步骤
对于模板注入漏洞的研究能够参考SQL注入,客户端的模板注入(CSTI)只能XSS,而服务端模板注入(SSTI)则可能形成XSS、LFI和任意代码执行。
漏洞发现及利用步骤分为:探测、判断、利用(读取、探索、攻击)
2.2.1 探测漏洞
1、文本类型
大多数的模板都支持文本的输入和输出:
如:freemarker=Hello ${username},smarty=Hello {user.name}
探测方法有两种:
1)XSS语句弹框测试;
2)使用模板语法:如reemarker=Hello${7*7},输出为Hello 49
2、代码类型
用户输入也能够放在模板语句中,一般做为变量名称,
如:personal_greeting=username
这种状况下,XSS的方法就无效了。可是咱们能够经过破坏 template 语句,并附加注入的HTML标签以确认漏洞,如:
personal_greeting=username<tag>
2.2.2 判断漏洞
检测到模板注入后,咱们须要判断具体的模板引擎。咱们须要 fuzz 不一样的字符,再经过返回的错误判断。当模板引擎屏蔽错误后,该类当法就失效了,而且暴力 fuzz对攻击自动化不友好:
根据不一样模板引擎的特性,经过输入上述payload能够快速判断模板引擎,
这里的绿线表示结果成功返回,红线反之。有时同一个可执行的 payload 会在不一样引擎中返回不一样的结果,比方说{{7*'7'}}会在 Twig 中返回49,而在 Jinja2 中则是7777777。
2.2.3 漏洞利用
和构造sql payload相似,对于模板注入的利用程度也取决于对于各个模板特性的了解,具体须要关注:
1) Template 使用手册,了解模板的基本语法
2) 内建方法,函数,变量,过滤器
3) 插件、扩展及沙箱机制
主要的payload集中在实现的攻击效果在:任意对象建立,任意文件读写,远程文件包含,信息泄露以及提权。
如:Jinja2:
Marko:
3、实例讲解
3.1 FreeMarker
FreeMaker 是 Java 下最受欢迎的模板引擎,在查看文档时咱们发现有两个已发布的可接受用户输入并执行命令的类实现TemplateModel:
<#assigntest="freemarker.template.utility.Execute"?new()>
<#assignob="freemarker.template.utility.ObjectConstructor"?new()>
以上的payload能够在建立模板时新建一个实例,后续调用会使得命令执行:
3.2 Velocity
Velocity是另外一种流行的Java模板语言,一样发现了两个能够利用的方法和属性:
$ class.inspect(类/对象/串) 返回一个检查指定类或对象的新ClassTool实例
$ class.type 返回正在检查的实际类
可使用$ class.type 连接$ class.inspect以获取对任意对象的引用。而后使用Runtime.exec()在目标系统上执行任意shell命令:
3.3 Smarty
Smarty 是一款 PHP 的模板语言。它使用安全模式来执行不信任的模板。它只运行 PHP 白名单里的函数,所以咱们不能直接调用 system()。而文档表示能够经过 $smarty 来获取许多环境变量后面,咱们又发现了 getStreamVariable,这个方法能够用来读取服务器读取+写入权限的任何文件:
1)任意读取文件
2)写文件建立后门:
3.4 Twig
Swig 和 Smarty 相似,不过咱们不能用它调用静态方法。但它提供了 _self,提供了指向 Twig_Environment 的env 属性。Twig_Environment 其中的 setCache 方法则能改变 Twig 加载 PHP 文件的路径。这样就能够经过改变路径实现 RFI:
在 getFilter 里有危险函数 call_user_func。经过传递传递参数到该函数中,能够调用任意 PHP 函数,注册 exec 为 filter 的回调函数并调用形成命令执行:
3.5 Jade
Jade 是一款 Node.js 模板引擎,能够在Node.js等框架中使用,它有比较简单的语法和编写方式:
3.6 AngularJS
AngularJS是由Google编写的MVC客户端框架。使用Angular,经过view-source或包含'ng-app'的Burp看到的HTML页面其实是模板,将由Angular呈现。这意味着若是用户输入直接嵌入到页面中,则应用程序可能容易受到客户端模板注入的攻击。即便用户输入是HTML编码的而且在属性内,也是如此。
AngularJS经过使用咱们称为指令(directives)的结构,让浏览器可以识别新的HTML标签。AngularJS读取自定义的HTML,并将页面中的输入或输出与JavaScript变量表示的模型绑定起来。这些JavaScript变量的值能够手工设置的,或者从静态或动态JSON资源中获取,但只能进行XSS攻击。
Payload以下:
4、漏洞测试及防护
4.1 漏洞测试
对于模板注入的黑盒测试,主要是探测程序所用模板类型,寻找输出点及攻击特性进行攻击;白盒测试需查看项目导入的第三方包,经过查找相关类进行跟踪,构造攻击向量。
4.2 防护手段
对于不一样的模板引擎,防护方案也不相同。但作好对用户输入的清理/过滤,将能大大的下降此类问题带来的安全威胁。另外一个选择是建立一个安全加固/沙箱环境,禁用或删除潜在的危险指令。
本文分享自微信公众号 - 卓文见识(zhuowenjianshi)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。