ATutor是ATutor团队的一套开源的基于Web的学习内容管理系统(LCMS)。该系统包括教学内容管理、论坛、聊天室等模块。Atutor与Claroline、 Moddle及Sakai号称为四大开源课程管理系统。
ATutor2.2.4语言导入功能处存在一处安全漏洞(CVE-2019-12169)。攻击者可利用该漏洞进行远程代码执行攻击。
经过分析发现,除了CVE-2019-1216所报道的语言导入功能外,ATutor在其他功能模块中也大量存在着相似的漏洞,本文会在后面针对这一点进行介绍。
据漏洞披露可知,漏洞触发点存在于mods/_core/languages/language_import.php文件中
首先跟入language_import.php文件
从language_import.php文件中35行起,可以发现关于文件上传相关代码
从上图红框中代码可知,此处代码块是对文件上传情况进行校验
在文件成功上传后,进入下一个if分支
在这个分支里,程序将调用\$languageManager->import方法对文件进行处理
继续跟入import方法
在import方法中,首先确认了用来保存上传文件的路径\$import_path
接着调用PclZip对压缩包进行处理。
为了更好的理解程序执行流程,我们动态调试一下
首先我们构造一个poc.php
将这个poc.php打包为poc.zip
访问如下链接以进入上传页面
http://target/ATutor/mods/_core/languages/language_import.php
在上传语言包页面中选择构造好的poc.zip并点击import按钮上传
请求发送给后台服务器,程序执行进入断点
此时的\$import_path值为atutor应用的/content/import路径:”content/import/”
程序调用PclZip的extract方法对压缩包进行解压
PclZip是一个强大的压缩与解压缩zip文件的PHP类,PclZip
library不仅能够压缩与解压缩Zip格式的文件;还能解压缩文档中的内容,同时也可以对现有的ZIP包进行添加或删除文件。
我们再来看下import方法中是如何使用PclZip的
程序创建了上传的zip压缩包的一个PclZip对象进行操作与控制,在解压过程中使用了extract方法。该方法中第一个参数是设置项,第二个是对应设置项的值
我们来看下PCLZIP_OPT_PATH设置项的作用
可见,PCLZIP_OPT_PATH设置项指定我们上传的zip文件解压目录为\$import_path参数对应的路径
解压成功后,poc.zip中内容出现在对应文件夹中
查看poc.php中的值,可以发现poc上传成功
访问如下地址,触发poc
除此之外,该应用几乎所有import接口,在后台都采用PclZip将上传的zip解压到对应目录中。然而这些操作无一例外的未对压缩包中的文件进行校验
下面举几个例子:
位于mods/_core/themes/import.php文件中的主题导入功能
代码如下:
可以发现,这里也使用了extract方法将上传文件进行解压
来看一下导入主题功能对应的前端页面
这里页面与导入语音包的页面极其相似,只不过最终解压后存放的路径不同,不再是content/import/,而是themes/
在此处上传构造好的poc.zip,最终poc.php将会被解压到themes文件夹中
位于/mods/_standard/tests/question_import.php文件的问题导入功能
位于mods/_standard/patcher/index_admin.php文件的补丁导入功能
这些功能无一例外的存在着相似的漏洞
针对单一文件上传,大多数Web应用都会进行严格的文件类型检测,但是涉及到压缩包上传,很多应用都不会检测压缩包中的内容,直接将压缩包中内容解压到对应目录中,这样就会导致了这类漏洞的产生。