ATutor学习内容管理系统任意文件上传漏洞(CVE-2019-12169)分析

漏洞介绍

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应用都会进行严格的文件类型检测,但是涉及到压缩包上传,很多应用都不会检测压缩包中的内容,直接将压缩包中内容解压到对应目录中,这样就会导致了这类漏洞的产生。

posted @ 2020-05-08 09:52  0DayBug  阅读(777)  评论(0编辑  收藏  举报