前言
Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。近期,著名的Drupal CMS网站爆出 7 个漏洞,在 Drupal 8.4.5 之前的 8.4.x 存在一个严重的访问控制绕过漏洞(CVE-2017-6926),具有发表评论权限的用户可以查看他们无权访问的文章评论,并且还可以回复该评论。
漏洞分析
漏洞出现在 /core/modules/comment/src/Controller/CommentController.php 文件内,此文件为 Drupal 的评论控制器,其中 replyFormAccess 函数在处理 entity 实体时没有对 entity 实体的权限进行判断,造成了用户可以访问本来没有权限查看的评论页面,并可以对评论进行回复,从而导致了越权的发生。这里需要注意的是此漏洞中的 entity 实体并不是指文章的评论,而是文章本身。
使用一个简单的实例来说明漏洞。假设 admin 用户公开发表了一篇文章,并作了评论,如下:
此时访问 http://127.0.0.1/drupal/comment/reply/node/1/comment/1 可以对 Hello World 这篇文章的第一个评论进行回复,其中 node 后面的 1 代表第一篇文章,comment 后的 1 代表第 1 条评论。
使用 admin 用户将这篇文章的 Published 状态去掉。
然后使用 attacker 用户(具有评论权限)登录,访问 node 页面时是看不到 Hello World 这篇文章的,因为它被 admin 用户隐藏了。
这时尝试直接访问 http://127.0.0.1/drupal/comment/reply/node/1/comment/1,发现可以访问,尝试评论:
评论后会跳转到 http://127.0.0.1/drupal/node/1#comment-2 页面,由于该页面被隐藏,所以会返回 Access denied,但同时会提示 Your comment has been posted。
这时使用 admin 用户登录,查看 Hello World 文章的评论,发现 attacker 用户在无法查看文章的情况下成功回复了第一条评论。
Drupal 在 2 月份的 commit 中修复了这一漏洞,在原来的基础上针对 entity 实体进行了权限判断:
allowedIf 函数返回 True 或 False。当一个普通用户无法查看某一篇文章时,allowedIf 函数对 $entity->access(‘view’); 的判断结果则为 False,此时这个用户则无法查看文章评论。补丁代码相当于在用户回复某篇文章的评论之前判断了其是否有权限访问这篇文章。
参考
作者: JenI 转载请注明出处,谢谢
Comments !