当前位置:七道奇文章资讯系统安全Linux安全
日期:2011-03-24 23:10:00  来源:本站整理

<b>open_basedir后大概存在的安全隐患</b>[Linux安全]

赞助商链接



  本文“<b>open_basedir后大概存在的安全隐患</b>[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

目前php站点的安全配置基本是open_basedir+safemode,确切很无敌、很安全,即便在权限没有很好设置的环境中,这样配置都是相当安全的,当然了,不考虑某些可以绕过的情形.本文谈论两点开启open_basedir后大概招致的安全隐患(实际碰到的),一个大概属于php的一个小bug,别的一个大概是由于配置不当产生的.

1、open_basedir中处理文件途径时没有严峻考虑目录的存在,这将招致本地包含大概本地文件读取的绕过.

看一个本地文件肆意读取的例子:

<?php
$file 
$_GET['file'];
preg_match("/^img/"$file) or die('error_file');
$file='/home/www/upload/'.$file;
file_exists($file) or die('no_such_file');
$f fopen("$file"'r');
$jpeg fread($ffilesize("$file"));
fclose($f);
Header("Content-type: image/jpeg");
Header("Content-disposition: inline; filename=test.jpg");
echo 
$jpeg;
?>

固然file是肆意提交的,但是限制了前缀必须为img,我们假如想跳出目录读文件,比方,读取网站根目录下的config.php,我们得提交?file=img/../../config.php,但是此处有个限制条件,就是upload目录下不存在img文件夹,在windows文件系统里,系统不会去考虑目录存在不存在,会直接跳转目录从而招致漏洞;但linux文件系统非常严谨,它会细心判断每一层目录能否存在,比方这里由于不存在img,则跳出去读取文件的时刻直接报错.看以下一个表示图:

再看一个近似的本地包含的例子:

<?php 
include "aaa".$_GET['lang'].".php";
?>

由于linux文件系统的限制,我们无法操纵旁注去包含tmp下的文件.

linux严谨的考虑在php那边明显没有得到深化的领会.在开启了open_basedir的时刻,php对传入的文件途径举行了取真实途径的处理,然后跟open_basedir中设置的途径举行对比:

……
/* normalize and expand path */
if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) {
return -1;
}

path_len = strlen(resolved_name);
memcpy(path_tmp, resolved_name, path_len + 1); /* safe */
……

(见fopen_wrappers.c)

但php在处理的时刻忽视了查抄途径能否存在,于是在开启了open_basedir时,上面那个文件读取的例子,我们可以利用?file=img/../../config.php来直接读取了,此时提交的途径已经被处理成/home/www/config.php了,所以不存在任何读取问题了.

问题由浸透测试的时刻碰到绕过的情形从而招致疑问,经解析环境差别,然后xi4oyu牛指导有大概是open_basedir的问题后测试总结出这是php的一个小的bug,但是很有大概招致安全隐患.

2、open_basedir的值配置不当,有大概招致目录超越.

很多管理员都知道设置open_basedir,但在配置不当的时刻大概发生目录超越的问题.

错误的配置:/tmp:/home/www,精确的配置:/tmp/:/home/www/

……
/* Resolve open_basedir to resolved_basedir */
if (expand_filepath(local_open_basedir, resolved_basedir TSRMLS_CC) != NULL) {
/* Handler for basedirs that end with a / */
resolved_basedir_len = strlen(resolved_basedir);
if (basedir[strlen(basedir) - 1] == PHP_DIR_SEPARATOR) {
if (resolved_basedir[resolved_basedir_len - 1] != PHP_DIR_SEPARATOR) {
resolved_basedir[resolved_basedir_len] = PHP_DIR_SEPARATOR;
resolved_basedir[++resolved_basedir_len] = '\0';
}
} else {
resolved_basedir[resolved_basedir_len++] = PHP_DIR_SEPARATOR;
resolved_basedir[resolved_basedir_len] = '\0';
}
……

(见fopen_wrappers.c)

php考虑了以/完毕的途径,但是假如没有/,就直接带入下文对比了.

于是,当新建一个网站为 /home/wwwoldjun/(均已经辨别设置open_basedir),假如配置错误,则可以从/home/www/目录跳转到/home/wwwoldjun/目录.

本地测试:

 
open_basedir后大概存在的安全隐患
举个浸透实例,某idc商在租用虚拟主机的时刻如此分配空间/home/wwwroot/userxxx/、/home/wwwroot/useryyy/...,而open_basedir是这样错误配置的:/tmp:/home/wwwroot/userxxx、/tmp:/home/wwwroot/useryyy.假如我们想通过配置的错误简单浸透下userxxx站点,我们该怎么做?

by:oldjun   以上是“<b>open_basedir后大概存在的安全隐患</b>[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .