这个世界上只有两种系统,一种是被黑过的系统,一种是被黑了也不知情的系统

今天一早@MT在群里发了一个漏洞报告Cross Site Request Forgery Bug in edX LMS

报告显示这是一个高危漏洞,报告里说:

In one specific case users could potentially escalate their privileges via an attack against staff or super users.

起初我还没在意,我粗略看了一下针对这个漏洞的Patch,并没发现报告中提到的one specific case,而后突然想到一个可能的攻击方法,动手一试,果然可行

我试着对自己维护的线上系统进行提权攻击,让大家看到漏洞的严重性,以便给大家有动力去修复它

最后会给出应对策略

攻击演示

首先这是一种CSRF攻击,

背景知识:CSRF

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。[1] 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

CSRF攻击的细节

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

有了以上两个对CSRF的了解(假设你也理解cookie的机制),我们就可以展开攻击了

参考 : 跨站请求伪造

攻击过程

目标

我对线上服务器进行提权攻击

目标服务参数:Ubuntu12.04 64bit 运行Open edx dogwood

攻击细节
  • 注册用户,选修课程
  • 给授课教师发送一份邮件,诱使被攻击者点击目标链接,如

<a href="http://MY_LMS/courses/course-v1:forum_test+forum_test+forum_test/bu/gao/su/ni?unique_student_identifier=wwj&rolename=staff&action=allow">点我点我</a> (修改细节)

至于如何鼓励被攻击者点击,这就是一个社会工程的问题了,不讨论

这是最初的课程团队

原始课程团队

这是攻击邮件

攻击邮件

被攻击者点击链接后,用户wwj成功被提权为staff,有课程的所有权限!

攻击成功之后的团队成员列表

攻击完成

成功提权,而后可以对课程做大多数的操作,包括添加学生,增删课程,增删学生,增删帖子等几乎针对课程的所有权限

漏洞分析

漏洞成因,报告中有说明:

Although the platform is already using Django’s Cross-Site Request Forgery (CSRF) middleware protection, some endpoints with side effects were found to be using GET methods

这是一种设计失误,不应该用get做非幂等操作

尤其是涉及权限操作的部分,应当放在csrf保护之下

策略

报告里也提到了应对策略

some endpoints with side effects were found to be using GET methods. The patch forces these endpoints to require POST, which also properly enables CSRF protection.

具体而言可以为当前使用的版本打Patch

关于如何使用打Patch可以参考这里How to create and apply a patch with Git,因为git apply 是一个事务性的操作,补丁要么都打上去,要么全部放弃,所以不要害怕有后遗症

对于新安装的平台,采用新的代码就不存在这个问题了,目前的bug只在遗留系统存在

考虑到CSRF攻击的模式,在漏洞修复之前,应该通知拥有课程管理权限的人员以及网站管理者不要点击未知邮件的链接/图片