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 限制的绕过。

关键点分析

  1. open_basedir 可以设置为相对路径:这是本漏洞利用的基础
  2. 路径解析过程中的字符串处理问题..\0 的特殊处理
  3. chdir()ini_set() 的交互影响:顺序操作产生的非预期效果

三、漏洞利用步骤

利用代码

chdir('img');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
echo(file_get_contents('flag'));

详细执行流程

  1. 进入子目录chdir('img') 将当前工作目录切换到 img 子目录
  2. 设置相对路径限制ini_set('open_basedir','..')open_basedir 设置为父目录
  3. 多次向上穿越目录:通过多次 chdir('..') 向上穿越目录结构
  4. 解除限制ini_set('open_basedir','/') 将限制设置为根目录
  5. 读取目标文件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 函数分析

这是漏洞利用的核心函数,其处理流程存在以下关键问题:

  1. 路径规范化处理

    • 使用 expand_filepath_with_mode 规范化路径
    • relative_to 为 NULL 时进入 else 逻辑
    • 通过 VCWD_GETCWD 宏(最终调用 _getcwd())获取当前工作目录
  2. 字符串处理问题

    • local_open_basedir 被赋值为 ..\0
    • resolved_basedir 的规范化流程与 resolved_name 相同
    • 由于 ..\0 的存在,if 条件判断为假,进入 else 逻辑
    • 导致 resolved_basedirresolved_name 的值几乎相同
    • 最终使 php_check_specific_open_basedir 一直返回 0(通过检查)
  3. 关键变量变化

    • resolved_name_len = strlen(resolved_name) 计算长度时遇到 \0 终止
    • strncmp 比较时前几位相同,返回 0(表示匹配)

五、漏洞利用条件

  1. PHP 版本:影响多个版本(具体版本范围需进一步测试确认)
  2. 权限要求:
    • 需要有执行 ini_set() 的权限
    • 需要有执行 chdir() 的权限
  3. 目录结构:
    • 需要存在至少一个可进入的子目录(如示例中的 img

六、防御措施

  1. 配置层面

    • 避免使用相对路径设置 open_basedir
    • 使用绝对路径进行限制,如:ini_set('open_basedir', '/var/www/html')
  2. 代码层面

    • ini_set()chdir() 等函数进行限制
    • 实现自定义的路径检查逻辑
  3. PHP 修复

    • 应修正路径解析过程中对 \0 的处理方式
    • 加强 open_basedir 的路径规范化检查

七、总结

这个漏洞利用方法展示了安全机制设计中的常见问题:当多个功能组合使用时可能产生非预期的行为。通过精心构造的操作顺序和相对路径的特殊处理,攻击者可以绕过原本有效的安全限制。这提醒我们在设计安全机制时需要全面考虑各种可能的交互场景。

Bypass open_ basedir 新方法技术分析文档 一、漏洞背景 open_basedir 是 PHP 中的一个重要安全配置选项,用于限制 PHP 脚本可以访问的文件系统目录。当设置后,PHP 将只能访问指定目录及其子目录中的文件,这可以有效防止目录遍历攻击。 二、漏洞原理 本方法通过巧妙利用 chdir() 和 ini_set() 函数的组合操作,结合 open_basedir 路径解析的特殊性,实现了对 open_basedir 限制的绕过。 关键点分析 open_basedir 可以设置为相对路径 :这是本漏洞利用的基础 路径解析过程中的字符串处理问题 : ..\0 的特殊处理 chdir() 与 ini_set() 的交互影响 :顺序操作产生的非预期效果 三、漏洞利用步骤 利用代码 详细执行流程 进入子目录 : 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 被赋值为 ..\0 resolved_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 的路径规范化检查 七、总结 这个漏洞利用方法展示了安全机制设计中的常见问题:当多个功能组合使用时可能产生非预期的行为。通过精心构造的操作顺序和相对路径的特殊处理,攻击者可以绕过原本有效的安全限制。这提醒我们在设计安全机制时需要全面考虑各种可能的交互场景。