MariaDB v11.1 通过 UDF 的 RCE — 基于 Ant1sec-ops/CVE-2024-27766 修改的 PoC。
| 受影响 | MariaDB v11.1 |
| 修复版本 | 10.5.25 / 10.6.18 / 10.11.8 / 11.0.6 / 11.1.5 / 11.2.4 / 11.4.2+ |
| 类型 | 通过用户定义函数(UDF)实现远程代码执行(RCE) |
MariaDB v11.1 允许具备足够数据库权限(FILE 权限 + 插件目录写入权限)的攻击者注册恶意 UDF,并通过它执行任意系统命令。
注意:MariaDB 基金会对此 CVE 提出异议,理由是未跨越任何权限边界。利用需要管理员级别的数据库访问权限或同等权限。
原始 PoC 使用 longlong 返回类型,因此 do_system() 仅返回命令是否成功——你无法直接从 SQL 中看到输出。
本版本将返回类型改为 char *,从而将标准输出作为查询结果返回。无需带外通道;只需运行 SELECT do_system('whoami'),输出就会直接显示。
| 原始版本 | 本 PoC | |
|---|---|---|
| 返回类型 | longlong | char * |
| 执行方式 | system() | _popen() + fgets() 循环 |
| SQL 结果 | 退出码 | 命令的标准输出 |
| 内存 | 无 | 堆分配,在 deinit 中释放 |
需要注意的一点:从 UDF 返回 char * 要求 MariaDB 预先知道缓冲区大小。do_system_init 设置 initid->max_length = 65536,与主函数中分配的输出缓冲区大小一致。
由于返回类型改变,注册函数时必须使用 RETURNS STRING —— 而不是原版的 RETURNS INTEGER。
CREATE FUNCTION do_system RETURNS STRING SONAME 'do_system.dll';
_popen / _pclose)FILE 权限和插件目录写入权限仅供教育和研究目的使用。请勿用于您没有所有权或明确测试许可的系统。