
MySQL Community Server 26.7.0 — высокий — JSON Duality DEFINER SQLi — NO_BACKSLASH_ESCAPES
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 конкатенирует строковые значения JSON с помощью escape_string_for_mysql (только обратный слэш), затем parse_sql под sql_mode вызывающего после переключения на sctx DEFINER представления. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' заставляет \' завершать SQL-литерал. Строка JSON, содержащая ', внедряет подзапрос / SET-список как DEFINER. Лаборатория: вызывающий с правами только на DML по представлению читает secret.s в проецируемый столбец name.
По умолчанию CREATE VIEW — DEFINER. X Plugin уже учитывает этот режим. JDV — нет. Ограничено функцией: требуется JSON Duality View.
| ID | CVE пока нет |
| Класс | SQLi (DEFINER; не RCE) |
| Доступ | Удалённый (аутентифицированный SQL; требуется DML по JSON Duality View) |
| CWE | CWE-89 |
| CVSS | High: 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) |
| Аутентификация | аутентифицированный; INSERT или UPDATE по JSON Duality View |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1. Свидетельство в проецируемом $.name. |
Имея DML по SQL SECURITY DEFINER JSON Duality View. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'. UPDATE (etag из SELECT) строкового поля, JSON-значение которого содержит '. Сгенерированный литерал _utf8mb4 '...' завершается. Остальная часть инструкции выполняется как DEFINER. Лаборатория выбирает secret.s.note в проецируемый столбец name. Прямой SELECT по secret.s даёт 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 устанавливает view_sctx перед run_substmt. Именно sql_mode вызывающего видит parse_sql.
Ошибочные пути: SQL SECURITY DEFINER между именем представления и AS даёт 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
Экранируйте строки JDV DML той же ветвью NO_BACKSLASH_ESCAPES, которая уже есть в X Plugin (escape_sql_quote против escape_string_for_mysql). Параметризуйте сгенерированные INSERT/UPDATE. Не выполняйте parse_sql над конкатенированными значениями под sctx DEFINER.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard