
MySQL Community Server 26.7.0 - Élevé - Injection SQL via DEFINER avec JSON Duality - NO_BACKSLASH_ESCAPES
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-jdv-definer-sqli
Classe : SQLi Portée : Distante
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
Le DML JSON Duality concatène les valeurs de chaînes JSON avec escape_string_for_mysql (backslash uniquement), puis parse_sql sous le sql_mode de l'invocateur après bascule vers le sctx du DEFINER de la vue. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' fait que \' termine le littéral SQL. Une chaîne JSON contenant ' injecte une sous-requête / une liste SET en tant que DEFINER. Labo : un invocateur disposant uniquement de DML sur la vue lit secret.s dans la colonne name projetée.
Le CREATE VIEW par défaut est DEFINER. Le X Plugin gère déjà ce mode. Le JDV non. Conditionné par une fonctionnalité : nécessite une JSON Duality View.
| ID | pas encore de CVE |
| Classe | SQLi (DEFINER ; pas de RCE) |
| Portée | Distante (SQL authentifié ; nécessite du DML sur une JSON Duality View) |
| CWE | CWE-89 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produit | MySQL Community Server mysqld |
| Affecté | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | authentifié ; INSERT ou UPDATE sur une JSON Duality View |
| Licence | GNU Affero GPL v3.0 |
| Labo | 127.0.0.1 uniquement. Témoin dans $.name projeté. |
Détenir du DML sur une JSON Duality View SQL SECURITY DEFINER. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'. UPDATE (etag issu du SELECT) d'un champ chaîne dont la valeur JSON contient '. Le littéral _utf8mb4 '...' généré se termine. Le reste de l'instruction s'exécute en tant que DEFINER. Le labo sélectionne secret.s.note dans la colonne name projetée. Un SELECT direct sur secret.s renvoie 1142.
Sans ce sql_mode, le même JSON est stocké comme un nom littéral. La citation reste une donnée.
Même chasse sur 26.7.0. Le démon par défaut non publié Crit/High était vide. Le DML JSON Duality concatène toujours les valeurs.
sbuf.append("_utf8mb4 '");
escape_string_for_mysql(&my_charset_utf8mb4_bin, ...);
sbuf.append(1, '\'');
create_sctx_guard installe view_sctx avant run_substmt. Le sql_mode de l'invocateur est ce que voit parse_sql.
Fausses pistes : SQL SECURITY DEFINER entre le nom de la vue et AS renvoie 1064 (le défaut est déjà DEFINER). Le même name que la ligne courante est ignoré (is_equal) ; injectez contre une valeur différente. L'etag est requis.
cd lab
./run.sh
Image mysql:26.7.0. Publiée sur 127.0.0.1:18640. Vue app.dv DEFINER root@% sur app.t. Secret dans secret.s. La victime dispose uniquement de SELECT/INSERT/UPDATE sur la vue.
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
Échapper les chaînes DML du JDV avec la même branche NO_BACKSLASH_ESCAPES que possède déjà le X Plugin (escape_sql_quote vs escape_string_for_mysql). Paramétrer l'INSERT/UPDATE généré. Ne pas parse_sql les valeurs concaténées sous un sctx DEFINER.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard