Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

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

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

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
mysql-mysqlbinlog-raw-path — MySQL Community Server 26.7.0 - 高危 - mysqlbinlog --raw Rotate 路径残留 - 客户端文件写入 | Kitploit
工具/GitHubGitHub/abraxas/mysql-mysqlbinlog-raw-path
漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试实验室与实践
GitHubabraxas/mysql-mysqlbinlog-raw-path

mysql-mysqlbinlog-raw-path

MySQL Community Server 26.7.0 - 高危 - mysqlbinlog --raw Rotate 路径残留 - 客户端文件写入

查看仓库
9天前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Abraxas Labs - mysql-mysqlbinlog-raw-path

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  mysql-mysqlbinlog-raw-path

mysql-mysqlbinlog-raw-path

类别: 文件写入(客户端) 可达性: 远程(UI:R)

MySQL Community Server mysqlbinlog 26.7.0(06a5c1c)- Oracle

mysqlbinlog --raw --read-from-remote-server 将 Rotate 事件的 new_log_ident 复制到 log_file_name,且未进行 basename 检查。随后的 FORMAT_DESCRIPTION 事件对该路径执行 my_fopen,并写入 BINLOG_MAGIC 及该事件。一个恶意 dump 若发送带有 / 的真实 Rotate ident,就会以客户端 UID 写入该文件。

--raw 是文档所述的远程 binlog 文件复制功能。遗留问题在于将 ident 当作路径处理。

ID暂无 CVE
类别文件写入(客户端 --raw BINLOG_MAGIC)
可达性远程(受害者对攻击者 dump 运行 mysqlbinlog --raw -R;UI:R)
CWECWE-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 mysqlbinlog
受影响版本26.7.0(06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)
认证受害者对攻击者 dump 运行 mysqlbinlog --raw -R
许可证GNU Affero GPL v3.0
实验环境仅 127.0.0.1。见证文件包含 BINLOG_MAGIC。文件写入,非 RCE。

攻击者能做什么

搭建一个 MySQL 协议服务器。使用 COM_BINLOG_DUMP 通信。发送一个匹配的伪造 Rotate(时间戳为 0,ident 等于请求的日志名),使 dump 不会停止。发送一个真实的 Rotate(时间戳 != 0),其 ident 为 /abs/path。发送一个 FORMAT_DESCRIPTION 事件。

运行 mysqlbinlog --raw -R ... mysql-bin.000001 的操作者会以客户端 UID 写入 /abs/path。内容为 binlog 字节(\xfebin 加上 FD 事件),而非任意载荷。可覆盖该 UID 能创建的任何路径。

真实的 mysqld 不会发出带有 / 的 Rotate ident。遗留问题出在客户端。

我是如何发现的

与 mysqldump SHOW TABLES 溢出 和 mysqldump --tab 路径 同属 26.7.0 的排查。默认守护进程为空。客户端工具仍然信任远程名称。

if (raw_mode) {
  if (output_file != nullptr) {
    snprintf(log_file_name, sizeof(log_file_name), "%s%s", output_file,
             rev->new_log_ident);
  } else {
    my_stpcpy(log_file_name, rev->new_log_ident);
  }
}

伪造 Rotate(when.tv_sec == 0)若其 ident 与请求的日志不匹配,会停止 dump。匹配的伪造 Rotate 在复制后被跳过(continue)。真实 Rotate 不会停止。下一个 FD:

if (!(result_file = my_fopen(
          log_file_name, O_WRONLY | MY_FOPEN_BINARY, MYF(MY_WME)))) {
  error("Could not create log file '%s'", log_file_name);

LOAD DATA 临时文件保持在 tmpdir 下的 SQL_LOAD_MB。已关闭。ident 长度被限制为 FN_REFLEN-1。/ 未被剥离。

已记录的弯路:发送 ident 为路径的伪造 Rotate(dump 停止);使用 --result-file(ident 成为前缀,不同的遗留问题);以真实 mysqld 作为预言机;校验和保持开启。

实验环境

cd lab
./run.sh

镜像 mysql:26.7.0。二进制文件 /usr/libexec/mysqlsh/mysqlbinlog Ver 26.7.0(该镜像中不在 PATH 上)。对照桩:伪造 Rotate mysql-bin.000001 加 FD 写入 work/mysql-bin.000001。遍历桩:匹配的伪造 Rotate、真实 Rotate ident /work/oracle/MYSQL-BINLOG-RAW-WITNESS、FD 写入该路径(BINLOG_MAGIC)。发布 127.0.0.1:18620 / 18621。将其绑定到回环地址。写入 binlog 字节的文件写入,非 RCE。无 --result-file。

control-basename=yes
traversal-outside=yes
SUCCESS mysql-mysqlbinlog-raw-path ... MYSQL-BINLOG-RAW-WITNESS

修复方案

在 my_stpcpy / snprintf 写入 log_file_name 之前,对 new_log_ident 取 basename。--raw 应写入 cwd 或 --result-file 前缀下,而非带有 / 的 ident。

参考资料

  • github.com/mysql/mysql-server 标签 mysql-26.7.0(06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)
  • client/mysqlbinlog.cc dump_remote_log_entries
  • 同类包:abraxas/mysql-mysqldump-show-tables-overflow · abraxas/mysql-mysqldump-tab-path
下载工具