abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-jdv-definer-sqli
类别: SQLi 可达性: 远程
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
JSON Duality DML 使用 escape_string_for_mysql(仅反斜杠)拼接 JSON 字符串值,然后在切换到视图 DEFINER sctx 后,在调用者的 sql_mode 下执行 parse_sql。SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' 会使 \' 结束 SQL 字面量。包含 ' 的 JSON 字符串会以 DEFINER 身份注入子查询 / SET 列表。实验环境:仅对视图具有 DML 权限的调用者将 secret.s 读取到投影的 name 列中。
默认的 CREATE VIEW 是 DEFINER。X Plugin 已经根据该模式进行分支处理。JDV 没有。受特性门控:需要 JSON Duality View。
| ID | 暂无 CVE |
| 类别 | SQLi(DEFINER;非 RCE) |
| 可达性 | 远程(已认证 SQL;需要对 JSON Duality View 的 DML 权限) |
| CWE | CWE-89 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 产品 | MySQL Community Server mysqld |
| 受影响版本 | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| 认证 | 已认证;对 JSON Duality View 的 INSERT 或 UPDATE |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1。在投影的 $.name 中可见。 |
对 SQL SECURITY DEFINER JSON Duality View 持有 DML 权限。SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'。UPDATE(etag 来自 SELECT)一个字符串字段,其 JSON 值包含 '。生成的 _utf8mb4 '...' 字面量结束。语句的其余部分以 DEFINER 身份执行。实验环境将 secret.s.note 选择到投影的 name 列中。直接对 secret.s 执行 SELECT 会返回 1142。
如果没有该 sql_mode,相同的 JSON 会作为字面量名称存储。引号保持为数据。
同样是 26.7.0 的搜寻。默认守护进程未发布的 Crit/High 为空。JSON Duality DML 仍然拼接值。
sbuf.append("_utf8mb4 '");
escape_string_for_mysql(&my_charset_utf8mb4_bin, ...);
sbuf.append(1, '\'');
create_sctx_guard 在 run_substmt 之前安装 view_sctx。调用者的 sql_mode 正是 parse_sql 所看到的。
错误尝试:在视图名称和 AS 之间使用 SQL SECURITY DEFINER 会返回 1064(默认已经是 DEFINER)。与当前行相同的 name 会被跳过(is_equal);针对不同的值进行注入。Etag 是必需的。
cd lab
./run.sh
镜像 mysql:26.7.0。发布端口 127.0.0.1:18640。视图 app.dv 的 DEFINER 为 root@%,基于 app.t。密钥在 secret.s 中。受害者仅对视图具有 SELECT/INSERT/UPDATE 权限。
SUCCESS mysql-jdv-definer-sqli victim-secret=denied nbe-inject=yes view-has-witness=yes default-mode-inject=no dump=26.7.0 image=mysql:26.7.0 MYSQL-JDV-DEFINER-SQLI-WITNESS
使用 X Plugin 已有的相同 NO_BACKSLASH_ESCAPES 分支(escape_sql_quote 对比 escape_string_for_mysql)来转义 JDV DML 字符串。对生成的 INSERT/UPDATE 进行参数化。不要在 DEFINER sctx 下对拼接的值执行 parse_sql。
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard