
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
Classe: SQLi Portata: Remota
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
Il DML JSON Duality concatena i valori stringa JSON con escape_string_for_mysql (solo backslash), poi parse_sql sotto l'sql_mode dell'invoker dopo lo scambio al sctx del DEFINER della view. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' fa terminare il letterale SQL con \'. Una stringa JSON contenente ' inietta una sottoquery / SET-list come DEFINER. Lab: invoker con solo DML sulla view legge secret.s nella colonna proiettata name.
Il CREATE VIEW predefinito è DEFINER. X Plugin effettua già il branch su quella modalità. JDV no. Feature-gated: richiede una JSON Duality View.
| ID | nessuna CVE al momento |
| Classe | SQLi (DEFINER; non RCE) |
| Portata | Remota (SQL autenticato; richiede DML su una 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 |
| Prodotto | MySQL Community Server mysqld |
| Affetto | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | autenticato; INSERT o UPDATE su una JSON Duality View |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1. Witness in $.name proiettato. |
Possiede DML su una JSON Duality View SQL SECURITY DEFINER. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'. UPDATE (etag da SELECT) di un campo stringa il cui valore JSON contiene '. Il letterale generato _utf8mb4 '...' termina. Il resto dell'istruzione viene eseguito come DEFINER. Il lab seleziona secret.s.note nella colonna proiettata name. La SELECT diretta su secret.s restituisce 1142.
Senza quel sql_mode lo stesso JSON viene memorizzato come nome letterale. La virgoletta resta un dato.
Stessa caccia alla 26.7.0. Il daemon predefinito non pubblicava Crit/High. Il DML JSON Duality concatena comunque i valori.
sbuf.append("_utf8mb4 '");
escape_string_for_mysql(&my_charset_utf8mb4_bin, ...);
sbuf.append(1, '\'');
create_sctx_guard installa view_sctx prima di run_substmt. L'sql_mode dell'invoker è ciò che vede parse_sql.
Vicoli ciechi: SQL SECURITY DEFINER tra il nome della view e AS restituisce 1064 (il default è già DEFINER). Lo stesso name della riga corrente viene saltato (is_equal); iniettare contro un valore diverso. L'etag è obbligatorio.
cd lab
./run.sh
Immagine mysql:26.7.0. Pubblicata su 127.0.0.1:18640. View app.dv DEFINER root@% su app.t. Secret in secret.s. La vittima ha solo SELECT/INSERT/UPDATE sulla view.
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
Effettuare l'escape delle stringhe DML JDV con lo stesso branch NO_BACKSLASH_ESCAPES che X Plugin già possiede (escape_sql_quote vs escape_string_for_mysql). Parametrizzare l'INSERT/UPDATE generato. Non eseguire parse_sql sui valori concatenati sotto un sctx DEFINER.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard