bypass open_basedir的新方法
字数 1883 2025-08-26 22:11:35
Bypass open_basedir 新方法技术分析文档
一、漏洞背景
open_basedir 是 PHP 中的一个重要安全配置选项,用于限制 PHP 脚本可以访问的文件系统目录。当设置后,PHP 将只能访问指定目录及其子目录中的文件,这可以有效防止目录遍历攻击。
二、漏洞原理
本方法通过巧妙利用 chdir() 和 ini_set() 函数的组合操作,结合 open_basedir 路径解析的特殊性,实现了对 open_basedir 限制的绕过。
关键点分析
open_basedir可以设置为相对路径:这是本漏洞利用的基础- 路径解析过程中的字符串处理问题:
..\0的特殊处理 chdir()与ini_set()的交互影响:顺序操作产生的非预期效果
三、漏洞利用步骤
利用代码
chdir('img');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
echo(file_get_contents('flag'));
详细执行流程
- 进入子目录:
chdir('img')将当前工作目录切换到img子目录 - 设置相对路径限制:
ini_set('open_basedir','..')将open_basedir设置为父目录 - 多次向上穿越目录:通过多次
chdir('..')向上穿越目录结构 - 解除限制:
ini_set('open_basedir','/')将限制设置为根目录 - 读取目标文件:
file_get_contents('flag')读取原本受限制的文件
四、技术细节分析
1. ini_set() 函数内部处理
- 通过
zend_alter_ini_entry_ex函数修改配置 - 修改过程:
new_value => duplicate => ini_entry->value - 直接影响
EG(Executor Globals) 表中的值,最终影响PG(Per-directory Globals)
2. chdir() 函数内部处理
- 首先经过
php_check_open_basedir检测 - 通过
VCWD_CHDIR宏最终调用_chdir()系统调用 - 关键点:
open_basedir检查在目录变更之前执行
3. php_check_specific_open_basedir 函数分析
这是漏洞利用的核心函数,其处理流程存在以下关键问题:
-
路径规范化处理:
- 使用
expand_filepath_with_mode规范化路径 - 当
relative_to为 NULL 时进入 else 逻辑 - 通过
VCWD_GETCWD宏(最终调用_getcwd())获取当前工作目录
- 使用
-
字符串处理问题:
local_open_basedir被赋值为..\0resolved_basedir的规范化流程与resolved_name相同- 由于
..\0的存在,if条件判断为假,进入 else 逻辑 - 导致
resolved_basedir和resolved_name的值几乎相同 - 最终使
php_check_specific_open_basedir一直返回 0(通过检查)
-
关键变量变化:
resolved_name_len = strlen(resolved_name)计算长度时遇到\0终止strncmp比较时前几位相同,返回 0(表示匹配)
五、漏洞利用条件
- PHP 版本:影响多个版本(具体版本范围需进一步测试确认)
- 权限要求:
- 需要有执行
ini_set()的权限 - 需要有执行
chdir()的权限
- 需要有执行
- 目录结构:
- 需要存在至少一个可进入的子目录(如示例中的
img)
- 需要存在至少一个可进入的子目录(如示例中的
六、防御措施
-
配置层面:
- 避免使用相对路径设置
open_basedir - 使用绝对路径进行限制,如:
ini_set('open_basedir', '/var/www/html')
- 避免使用相对路径设置
-
代码层面:
- 对
ini_set()和chdir()等函数进行限制 - 实现自定义的路径检查逻辑
- 对
-
PHP 修复:
- 应修正路径解析过程中对
\0的处理方式 - 加强
open_basedir的路径规范化检查
- 应修正路径解析过程中对
七、总结
这个漏洞利用方法展示了安全机制设计中的常见问题:当多个功能组合使用时可能产生非预期的行为。通过精心构造的操作顺序和相对路径的特殊处理,攻击者可以绕过原本有效的安全限制。这提醒我们在设计安全机制时需要全面考虑各种可能的交互场景。