系统地搜索PHP disable_functions绕过
字数 1250 2025-08-27 12:33:48
PHP disable_functions 绕过技术研究
1. 背景与概述
PHP 的 disable_functions 配置用于限制某些危险函数的使用,但存在多种绕过方法。本文系统性地研究如何发现和利用 PHP 内置函数中的漏洞来绕过 disable_functions 限制。
2. 研究方法论
2.1 总体思路
- 抽取 PHP 函数的每个参数
- 使用正确的参数调用每个函数
- 跟踪函数执行过程
- 在跟踪过程中寻找可能的危险调用
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 函数的错误信息推断参数类型:
- 不传参数调用函数
- 检查错误信息中需要的参数数量
- 用字符串填充参数
- 解析警告中的期望参数类型
- 替换为正确类型重复测试
示例实现:
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() 函数绕过
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 绕过方法。组合使用反射、调试和错误分析技术可以自动化这一过程,提高安全研究的效率。防御方应了解这些技术原理,采取多层次防御措施。