ATutor学习内容管理系统任意文件上传漏洞(CVE-2019-12169)分析
字数 1427 2025-08-25 22:58:35
ATutor学习内容管理系统任意文件上传漏洞(CVE-2019-12169)分析报告
漏洞概述
ATutor是ATutor团队开发的一套开源的基于Web的学习内容管理系统(LCMS),与Claroline、Moodle及Sakai并称为四大开源课程管理系统。该系统包含教学内容管理、论坛、聊天室等模块。
在ATutor 2.2.4版本中,存在一个高危的任意文件上传漏洞(CVE-2019-12169),攻击者可利用该漏洞进行远程代码执行攻击。漏洞主要存在于语言导入功能模块,但分析发现类似漏洞模式存在于系统的多个功能模块中。
漏洞分析
漏洞位置
主要漏洞触发点位于:
mods/_core/languages/language_import.php
漏洞原理
-
文件上传处理流程:
- 系统接收用户上传的ZIP文件
- 使用PclZip类库对压缩包进行解压
- 解压过程中未对压缩包内文件进行任何安全检查
- 直接将压缩包内容解压到服务器指定目录
-
关键代码分析:
- 文件上传校验部分代码(language_import.php第35行起):
// 文件上传校验代码 if ($_FILES['file']['error'] == 0) { // 文件上传成功后的处理 } - 文件导入处理部分:
$languageManager->import($_FILES['file']['tmp_name']); - import方法实现(关键漏洞点):
public function import($file) { $import_path = "content/import/"; // 使用PclZip解压文件 $archive = new PclZip($file); $archive->extract(PCLZIP_OPT_PATH, $import_path); }
- 文件上传校验部分代码(language_import.php第35行起):
-
PclZip类库使用问题:
- PCLZIP_OPT_PATH设置项指定解压目录为
$import_path(默认"content/import/") - 解压过程中未对压缩包内文件类型、内容进行任何校验
- 攻击者可上传包含恶意脚本的ZIP文件,解压后可直接访问执行
- PCLZIP_OPT_PATH设置项指定解压目录为
漏洞复现步骤
-
构造恶意文件:
- 创建包含PHP webshell的文件(如poc.php)
- 将文件打包为ZIP格式(poc.zip)
-
上传恶意文件:
- 访问语言导入页面:
http://target/ATutor/mods/_core/languages/language_import.php - 选择构造的poc.zip文件并点击"Import"按钮
- 访问语言导入页面:
-
文件解压:
- 系统将poc.zip解压到content/import/目录
- 恶意文件poc.php被放置在可访问路径
-
触发漏洞:
- 访问上传的webshell:
http://target/ATutor/content/import/poc.php
- 访问上传的webshell:
其他受影响模块
分析发现,类似漏洞模式存在于ATutor多个功能模块中:
-
主题导入功能:
- 文件位置:
mods/_core/themes/import.php - 解压路径:
themes/ - 攻击者可上传恶意主题包,解压后webshell位于themes目录
- 文件位置:
-
问题导入功能:
- 文件位置:
mods/_standard/tests/question_import.php - 同样存在未校验的ZIP解压操作
- 文件位置:
-
补丁导入功能:
- 文件位置:
mods/_standard/patcher/index_admin.php - 补丁导入时也存在相同漏洞
- 文件位置:
漏洞修复建议
-
输入验证:
- 对上传的ZIP文件内容进行严格校验
- 检查压缩包内文件类型,禁止上传可执行文件(如.php)
-
安全配置:
- 设置content/import/目录不可执行PHP脚本
- 使用.htaccess或服务器配置限制目录执行权限
-
代码修复:
- 在解压前检查压缩包内文件类型
- 实现白名单机制,只允许特定类型文件解压
-
权限控制:
- 限制语言导入功能的管理员权限
- 实现操作日志记录,监控可疑上传行为
漏洞总结
该漏洞属于典型的"未校验压缩包内容"导致的安全问题,反映了开发中常见的安全盲点。针对单一文件上传,大多数Web应用会进行严格的文件类型检测,但对于压缩包上传,往往忽略了对压缩包内内容的检查,导致攻击者可以绕过常规的文件上传防护机制。
此案例也展示了"一处漏洞,多处存在"的安全问题模式,在代码审计时应特别注意重复使用的功能模块和类库调用。