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

漏洞原理

  1. 文件上传处理流程

    • 系统接收用户上传的ZIP文件
    • 使用PclZip类库对压缩包进行解压
    • 解压过程中未对压缩包内文件进行任何安全检查
    • 直接将压缩包内容解压到服务器指定目录
  2. 关键代码分析

    • 文件上传校验部分代码(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);
      }
      
  3. PclZip类库使用问题

    • PCLZIP_OPT_PATH设置项指定解压目录为$import_path(默认"content/import/")
    • 解压过程中未对压缩包内文件类型、内容进行任何校验
    • 攻击者可上传包含恶意脚本的ZIP文件,解压后可直接访问执行

漏洞复现步骤

  1. 构造恶意文件

    • 创建包含PHP webshell的文件(如poc.php)
    • 将文件打包为ZIP格式(poc.zip)
  2. 上传恶意文件

    • 访问语言导入页面:
      http://target/ATutor/mods/_core/languages/language_import.php
      
    • 选择构造的poc.zip文件并点击"Import"按钮
  3. 文件解压

    • 系统将poc.zip解压到content/import/目录
    • 恶意文件poc.php被放置在可访问路径
  4. 触发漏洞

    • 访问上传的webshell:
      http://target/ATutor/content/import/poc.php
      

其他受影响模块

分析发现,类似漏洞模式存在于ATutor多个功能模块中:

  1. 主题导入功能

    • 文件位置:mods/_core/themes/import.php
    • 解压路径:themes/
    • 攻击者可上传恶意主题包,解压后webshell位于themes目录
  2. 问题导入功能

    • 文件位置:mods/_standard/tests/question_import.php
    • 同样存在未校验的ZIP解压操作
  3. 补丁导入功能

    • 文件位置:mods/_standard/patcher/index_admin.php
    • 补丁导入时也存在相同漏洞

漏洞修复建议

  1. 输入验证

    • 对上传的ZIP文件内容进行严格校验
    • 检查压缩包内文件类型,禁止上传可执行文件(如.php)
  2. 安全配置

    • 设置content/import/目录不可执行PHP脚本
    • 使用.htaccess或服务器配置限制目录执行权限
  3. 代码修复

    • 在解压前检查压缩包内文件类型
    • 实现白名单机制,只允许特定类型文件解压
  4. 权限控制

    • 限制语言导入功能的管理员权限
    • 实现操作日志记录,监控可疑上传行为

漏洞总结

该漏洞属于典型的"未校验压缩包内容"导致的安全问题,反映了开发中常见的安全盲点。针对单一文件上传,大多数Web应用会进行严格的文件类型检测,但对于压缩包上传,往往忽略了对压缩包内内容的检查,导致攻击者可以绕过常规的文件上传防护机制。

此案例也展示了"一处漏洞,多处存在"的安全问题模式,在代码审计时应特别注意重复使用的功能模块和类库调用。

ATutor学习内容管理系统任意文件上传漏洞(CVE-2019-12169)分析报告 漏洞概述 ATutor是ATutor团队开发的一套开源的基于Web的学习内容管理系统(LCMS),与Claroline、Moodle及Sakai并称为四大开源课程管理系统。该系统包含教学内容管理、论坛、聊天室等模块。 在ATutor 2.2.4版本中,存在一个高危的任意文件上传漏洞(CVE-2019-12169),攻击者可利用该漏洞进行远程代码执行攻击。漏洞主要存在于语言导入功能模块,但分析发现类似漏洞模式存在于系统的多个功能模块中。 漏洞分析 漏洞位置 主要漏洞触发点位于: 漏洞原理 文件上传处理流程 : 系统接收用户上传的ZIP文件 使用PclZip类库对压缩包进行解压 解压过程中未对压缩包内文件进行任何安全检查 直接将压缩包内容解压到服务器指定目录 关键代码分析 : 文件上传校验部分代码(language_ import.php第35行起): 文件导入处理部分: import方法实现(关键漏洞点): PclZip类库使用问题 : PCLZIP_ OPT_ PATH设置项指定解压目录为 $import_path (默认"content/import/") 解压过程中未对压缩包内文件类型、内容进行任何校验 攻击者可上传包含恶意脚本的ZIP文件,解压后可直接访问执行 漏洞复现步骤 构造恶意文件 : 创建包含PHP webshell的文件(如poc.php) 将文件打包为ZIP格式(poc.zip) 上传恶意文件 : 访问语言导入页面: 选择构造的poc.zip文件并点击"Import"按钮 文件解压 : 系统将poc.zip解压到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应用会进行严格的文件类型检测,但对于压缩包上传,往往忽略了对压缩包内内容的检查,导致攻击者可以绕过常规的文件上传防护机制。 此案例也展示了"一处漏洞,多处存在"的安全问题模式,在代码审计时应特别注意重复使用的功能模块和类库调用。