Mar
23

open_basedir后可能存在的安全隐患

目前php站点的安全配置基本是open_basedir+safemode,确实很无敌、很安全,即使在权限没有很好设置的环境中,这样配置都是相当安全的,当然了,不考虑某些可以绕过的情况。本文讨论两点开启open_basedir后可能导致的安全隐患(现实遇到的),一个也许属于php的一个小bug,另外一个可能是由于配置不当产生的。

一、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,则跳出去读取文件的时候直接报错。看如下一个示意图:
linux

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

<?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,但是很有可能导致安全隐患。

二、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/目录。

本地测试:
test

举个渗透实例,某idc商在租用虚拟主机的时候如此分配空间/home/wwwroot/userxxx/、/home/wwwroot/useryyy/...,而open_basedir是这样错误配置的:/tmp:/home/wwwroot/userxxx、/tmp:/home/wwwroot/useryyy。如果我们想通过配置的错误轻易渗透下userxxx站点,我们该怎么做?

共有22条评论

  1. winsyk: Mar,24th,2011

    顶oldjun,之前也发现了这个问题。
    建议大家设置open_basedir的时候可以这样设置。
    "/tmp":"/wwwroot/userxxxx":"/wwwroot/user000xx"
    可以防止被包含,读取敏感数据。

  2. k4shifz: Mar,26th,2011

    顶军神和楼上,学习了

  3. Master: Mar,26th,2011

    学习了。支持老君

  4. riyue: Apr,11th,2011

    很好很强大

  5. 好听的英文名字: Apr,12th,2011

    确实很强大啊。。

  6. water: Apr,13th,2011

    t00ls.net
    还有林大和杨大的blog无法访问了,貌似squid那问题..

  7. oldjun: Apr,13th,2011

    可以自行解析访问!

  8. 小张: Apr,22nd,2011

    学一下,很崇拜你............

  9. 芳草: May,14th,2011

    不错,学习

  10. 安安: May,14th,2011

    呵呵,很好

  11. 芳草: May,14th,2011

    支持你,只是个传说

  12. 双眼皮: May,28th,2011

    顶吐司的大牛。

  13. Garfield: May,30th,2011

    老君大牛、土司的邀请码怎么得?现在是不是暂时不对外开放?不允许注册啊?

  14. oldjun: May,30th,2011

    为了确保会员的质量,邀请码请找熟悉你的核心会员索取!

  15. Garfield: Jun,14th,2011

    核心的也不认识谁啊...纠结,就是经常跑LCX的跟你这转转,会XXOO,不算高手,偶尔会挖了半天挖出个oday,linux跟unix的还不是很熟悉,不会手写编程。所以才想搞个邀请进土司里盯几个大牛继续学学。如果觉得可以的话帮忙发个邀请到email吧。先感激下。

    --------------------------------------------------------------
    另外说下你这个验证码随机的好不舒服

  16. oldjun: Jun,17th,2011

    也可以申请!

    不舒服但简单!

  17. simple: Jun,20th,2011

    这东西好像在哪里看过!!主要是'/'的问题!!/home/wwwroot/userxxx这样设置的话是可以跨目录到wwwroot目录下所有以user开头的所有目录!应该设置为/home/wwwroot/userxxx/这样才是一个正确安全的目录路径!刚刚加了大牛的QQ!求个土司邀请码294660561@qq.com跟大牛交流下!!

  18. 粉丿丶兜兜: Jul,8th,2011

    改跟新啦 老O

  19. yulin: Jul,12th,2011

    偶像,好崇拜你,

  20. yulin: Jul,12th,2011

    你要是能收我做徒弟,这辈子就算死也无憾了,ke yi you chang
    哎,一个狂热的爱好者。

  21. oldjun: Jul,12th,2011

    兴趣是最好的老师,什么拜师啊什么的太假了,还是靠自己阿。有偿的话是赔了夫人又折兵。

  22. HAILAN: Nov,24th,2011

    我真的也很学,能推荐培训老师吗?谢谢了。

NAME:

required

E-MAIL:

required, will not be published

HOMEPAGE:

CONTENT:

VERIFY:(请输入P后的英文字母!)

required