系统地搜索PHP disable_functions绕过
字数 1250 2025-08-27 12:33:48

PHP disable_functions 绕过技术研究

1. 背景与概述

PHP 的 disable_functions 配置用于限制某些危险函数的使用,但存在多种绕过方法。本文系统性地研究如何发现和利用 PHP 内置函数中的漏洞来绕过 disable_functions 限制。

2. 研究方法论

2.1 总体思路

  1. 抽取 PHP 函数的每个参数
  2. 使用正确的参数调用每个函数
  3. 跟踪函数执行过程
  4. 在跟踪过程中寻找可能的危险调用

2.2 参数提取技术

方法一:使用 ReflectionFunction

$all = get_defined_functions();
$bad = array('sleep', 'usleep', ...); // 排除危险函数
$all = array_diff($all["internal"], $bad);

foreach($all as $function) {
    $parameters = " $function ";
    $f = new ReflectionFunction($function);
    foreach($f->getParameters() as $param) {
        $parameters .= $param->isArray() ? "ARRAY " : "STRING ";
    }
    echo substr($parameters, 0, -1) . "\n";
}

缺点:只能区分字符串和数组类型,无法获取更详细的参数类型。

方法二:Hook zend_parse_parameters

使用 Frida 工具 hook PHP 内部函数 zend_parse_parameters,可以获取精确的参数类型信息。

缺点:PHP7 使用新的 ZPP API (Zend Parameter Parsing),旧方法不再适用。

方法三:GDB 调试分析

编译带调试符号的 PHP:

./configure CFLAGS="-g -O0"
make -j10
sudo make install

使用 GDB 脚本分析 ZPP API 调用:

class zifArgs(gdb.Command):
    # GDB 脚本实现
    # 解析 ZEND_PARSE_PARAMETERS_START 和 ZEND_PARSE_PARAMETERS_END 之间的参数

示例输出

md5 STRING OPTIONAL BOOL
time OPTIONAL LONG BOOL

方法四:错误信息分析

通过解析 PHP 函数的错误信息推断参数类型:

  1. 不传参数调用函数
  2. 检查错误信息中需要的参数数量
  3. 用字符串填充参数
  4. 解析警告中的期望参数类型
  5. 替换为正确类型重复测试

示例实现

class zifArgsError(gdb.Command):
    # 通过错误信息推断参数的 GDB 命令

示例输出

array_map(2): CALLABLE ARRAY

3. 危险函数识别与利用

3.1 函数跟踪技术

使用 strace 跟踪系统调用:

strace -f /usr/bin/php -r 'mail("aaa","aaa","aaa","aaa");' 2>&1 | grep exe

示例输出

execve("/usr/bin/php", ["/usr/bin/php", "-r", "mail(\"aaa\",\"aaa\",\"aaa\",\"aaa\28 vars */]) = 0
[pid 471] execve("/bin/sh", ["sh", "-c", "/usr/sbin/sendmail -t -i "], [/* 28 vars */] <unfinished ...>

3.2 典型绕过案例

mail() 函数绕过

  1. mail() 函数内部会调用 /usr/sbin/sendmail
  2. 如果允许 putenv(),可以设置 LD_PRELOAD 环境变量
  3. 在调用外部二进制时加载恶意共享库

imap_open() 绕过 (CVE-2018-19518)

类似 ShellShock 的注入方式,可以在 disable_functions 未禁止的函数中注入 OS 命令。

4. 自动化检测流程

  1. 参数提取:组合使用上述方法获取函数参数信息
  2. 函数调用:使用正确参数调用每个函数
  3. 执行跟踪:使用 strace/ltrace 跟踪执行
  4. 危险调用检测:分析跟踪日志中的 execve 等系统调用
  5. 利用验证:验证潜在绕过方法的有效性

5. 防御建议

  1. 定期审查 disable_functions 配置
  2. 监控 PHP 函数的安全更新
  3. 限制 putenv() 等环境变量操作函数
  4. 使用 SELinux/AppArmor 等强制访问控制机制
  5. 保持 PHP 版本更新,及时修补已知漏洞

6. 总结

通过系统性地分析 PHP 函数参数和执行路径,可以发现潜在的 disable_functions 绕过方法。组合使用反射、调试和错误分析技术可以自动化这一过程,提高安全研究的效率。防御方应了解这些技术原理,采取多层次防御措施。

PHP disable_ functions 绕过技术研究 1. 背景与概述 PHP 的 disable_functions 配置用于限制某些危险函数的使用,但存在多种绕过方法。本文系统性地研究如何发现和利用 PHP 内置函数中的漏洞来绕过 disable_functions 限制。 2. 研究方法论 2.1 总体思路 抽取 PHP 函数的每个参数 使用正确的参数调用每个函数 跟踪函数执行过程 在跟踪过程中寻找可能的危险调用 2.2 参数提取技术 方法一:使用 ReflectionFunction 缺点 :只能区分字符串和数组类型,无法获取更详细的参数类型。 方法二:Hook zend_ parse_ parameters 使用 Frida 工具 hook PHP 内部函数 zend_parse_parameters ,可以获取精确的参数类型信息。 缺点 :PHP7 使用新的 ZPP API (Zend Parameter Parsing),旧方法不再适用。 方法三:GDB 调试分析 编译带调试符号的 PHP: 使用 GDB 脚本分析 ZPP API 调用: 示例输出 : 方法四:错误信息分析 通过解析 PHP 函数的错误信息推断参数类型: 不传参数调用函数 检查错误信息中需要的参数数量 用字符串填充参数 解析警告中的期望参数类型 替换为正确类型重复测试 示例实现 : 示例输出 : 3. 危险函数识别与利用 3.1 函数跟踪技术 使用 strace 跟踪系统调用: 示例输出 : 3.2 典型绕过案例 mail() 函数绕过 mail() 函数内部会调用 /usr/sbin/sendmail 如果允许 putenv() ,可以设置 LD_PRELOAD 环境变量 在调用外部二进制时加载恶意共享库 imap_ open() 绕过 (CVE-2018-19518) 类似 ShellShock 的注入方式,可以在 disable_functions 未禁止的函数中注入 OS 命令。 4. 自动化检测流程 参数提取 :组合使用上述方法获取函数参数信息 函数调用 :使用正确参数调用每个函数 执行跟踪 :使用 strace / ltrace 跟踪执行 危险调用检测 :分析跟踪日志中的 execve 等系统调用 利用验证 :验证潜在绕过方法的有效性 5. 防御建议 定期审查 disable_functions 配置 监控 PHP 函数的安全更新 限制 putenv() 等环境变量操作函数 使用 SELinux/AppArmor 等强制访问控制机制 保持 PHP 版本更新,及时修补已知漏洞 6. 总结 通过系统性地分析 PHP 函数参数和执行路径,可以发现潜在的 disable_functions 绕过方法。组合使用反射、调试和错误分析技术可以自动化这一过程,提高安全研究的效率。防御方应了解这些技术原理,采取多层次防御措施。