abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-tab-path
类别: 文件写入(客户端) 可达性: 远程(UI:R)
MySQL Community Server mysqldump 26.7.0(06a5c1c)- Oracle
mysqldump --tab=DIR 使用 fn_format 为每张表写入一个 .sql 文件,且未使用 MY_REPLACE_DIR。一个带有 / 或 .. 的恶意 SHOW TABLES 名称会保留该目录。DIR 被忽略。dump UID 通过 my_fopen 打开该路径。
--tab 被文档描述为同机模式,因为 .txt 会经过服务端的 INTO OUTFILE。而 .sql 仍然是客户端写入。
| ID | 暂无 CVE |
| 类别 | 文件写入(客户端 --tab .sql) |
| 可达性 | 远程(受害者对攻击者控制的 MySQL 运行 mysqldump --tab;UI:R) |
| CWE | CWE-22 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| 产品 | MySQL Community Server mysqldump |
| 受影响版本 | 26.7.0(06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| 认证 | 受害者对攻击者控制的 MySQL 运行 mysqldump --tab=DIR |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1。见证 .sql 位于 DIR 之外。 |
搭建一个 MySQL 协议服务器。用 /abs/path 或 ../outside 响应 SHOW TABLES。运行了 mysqldump --tab=/backup testdb 的操作者会以 dump UID 写入 /abs/path.sql(或相对于 cwd 的路径)。
覆盖该 UID 能创建的任何文件。与信任远程文件名的备份客户端属于同一类别。.txt 的 INTO OUTFILE 路径是服务端 FILE。遗留问题在于客户端的 .sql。
真正的 mysqld 不会发出带 / 的表名。遗留问题在客户端。
与 mysqldump SHOW TABLES 溢出 同属 26.7.0 的挖掘。默认守护进程是空的。客户端工具仍然信任 SHOW TABLES。溢出是其中一个遗留问题。--tab 是下一个。
static FILE *open_sql_file_for_table(const char *table, int flags) {
FILE *res;
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
convert_dirname(tmp_path, path, NullS);
res = my_fopen(fn_format(filename, table, tmp_path, ".sql",
MYF(MY_UNPACK_FILENAME | MY_APPEND_EXT)),
flags, MYF(MY_WME));
return res;
}
mysys/mf_format.cc:如果 dirname_part(name) 非空且 MY_REPLACE_DIR 关闭,则给定的 dir 不会被使用。
已记录的弯路:把真正的 mysqld 当作预言机;在 SHOW CREATE TABLE 之前就死在 SHOW TABLE STATUS(.sql 只有在 CREATE 成功后才打开);把 INTO OUTFILE 的 .txt 当作遗留问题;一个 64KiB 的名称再次触发 G1 溢出。
不是 MariaDB CVE-2025-13699(mariadb-dump 视图名遍历)。同一类别,MySQL Community 版本。
cd lab
./run.sh
镜像 mysql:26.7.0。--tab=/work/tabdir。对照桩表 t 写入 work/tabdir/t.sql。遍历桩表 /work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS 写入 work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS.sql。发布 127.0.0.1:18610 / 18611。将其绑定到回环地址。
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
为 --tab 客户端文件在 fn_format 中传入 MY_REPLACE_DIR,或先取表名的 basename。--tab=DIR 就应该表示 DIR。
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc