
MySQL Community Server 26.7.0 - Alta - JSON Duality DEFINER SQLi - NO_BACKSLASH_ESCAPES
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-jdv-definer-sqli
Clase: SQLi Alcance: Remoto
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
JSON Duality DML concatena valores de cadena JSON con escape_string_for_mysql (solo barra invertida), luego parse_sql bajo el sql_mode del invocador tras cambiar al sctx del DEFINER de la vista. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' hace que \' termine el literal SQL. Una cadena JSON que contiene ' inyecta una subconsulta / lista SET como DEFINER. Lab: invocador con solo DML sobre la vista lee secret.s en la columna proyectada name.
El CREATE VIEW por defecto es DEFINER. X Plugin ya ramifica según ese modo. JDV no. Condicionado por característica: requiere una JSON Duality View.
| ID | sin CVE todavía |
| Clase | SQLi (DEFINER; no RCE) |
| Alcance | Remoto (SQL autenticado; requiere DML sobre una JSON Duality View) |
| CWE | CWE-89 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Producto | MySQL Community Server mysqld |
| Afectado | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | autenticado; INSERT o UPDATE sobre una JSON Duality View |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1. Testigo en $.name proyectado. |
Tener DML sobre una JSON Duality View SQL SECURITY DEFINER. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'. UPDATE (etag del SELECT) de un campo de cadena cuyo valor JSON contiene '. El literal generado _utf8mb4 '...' termina. El resto de la sentencia se ejecuta como DEFINER. El lab selecciona secret.s.note en la columna proyectada name. El SELECT directo sobre secret.s es 1142.
Sin ese sql_mode el mismo JSON se almacena como un nombre literal. La comilla permanece como dato.
La misma caza de 26.7.0. El daemon por defecto sin publicar Crit/Alto estaba vacío. JSON Duality DML sigue concatenando valores.
sbuf.append("_utf8mb4 '");
escape_string_for_mysql(&my_charset_utf8mb4_bin, ...);
sbuf.append(1, '\'');
create_sctx_guard instala view_sctx antes de run_substmt. El sql_mode del invocador es lo que ve parse_sql.
Caminos erróneos: SQL SECURITY DEFINER entre el nombre de la vista y AS es 1064 (el valor por defecto ya es DEFINER). El mismo name que la fila actual se omite (is_equal); inyectar contra un valor diferente. El etag es obligatorio.
cd lab
./run.sh
Imagen mysql:26.7.0. Publicado 127.0.0.1:18640. Vista app.dv DEFINER root@% sobre app.t. Secreto en secret.s. La víctima tiene SELECT/INSERT/UPDATE solo sobre la vista.
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
Escapar las cadenas de JDV DML con la misma rama NO_BACKSLASH_ESCAPES que X Plugin ya tiene (escape_sql_quote vs escape_string_for_mysql). Parametrizar el INSERT/UPDATE generado. No hacer parse_sql de valores concatenados bajo un sctx DEFINER.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard