设为首页 收藏本站
查看: 1767|回复: 0

[经验分享] open_basedir后可能存在的安全隐患

[复制链接]

尚未签到

发表于 2019-1-27 15:56:40 | 显示全部楼层 |阅读模式
  目前php站点的安全配置基本是open_basedir+safemode,确实很无敌、很安全,即使在权限没有很好设置的环境中,这样配 置都是相当安全的,当然了,不考虑某些可以绕过的情况。本文讨论两点开启open_basedir后可能导致的安全隐患(现实遇到的),一个也许属于 php的一个小bug,另外一个可能是由于配置不当产生的。
  一、open_basedir中处理文件路径时没有严格考虑目录的存在,这将导致本地包含或者本地文件读取的绕过。
  看一个本地文件任意读取的例子:
     虽然file是任意提交的,但是限制了前缀必须为img,我们如果想跳出目录读文件,比如,读取网站根目录下的 config.php,我们得提交?file=img/../../config.php,但是此处有个限制条件,就是upload目录下不存在img文 件夹,在windows文件系统里,系统不会去考虑目录存在不存在,会直接跳转目录从而导致漏洞;但linux文件系统非常严谨,它会仔细判断每一层目录 是否存在,比如这里由于不存在img,则跳出去读取文件的时候直接报错。看如下一个示意图:

  再看一个类似的本地包含的例子:
     由于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/目录。
  本地测试:

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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-668382-1-1.html 上篇帖子: window.top、window.parent、window.open、window.opener 下篇帖子: 【OOW 2013】Oracle Open World 2013 甲骨文大会信息汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表