
MySQL Community Server 26.7.0 – Hoch – JSON Duality DEFINER SQLi – NO_BACKSLASH_ESCAPES
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-jdv-definer-sqli
Klasse: SQLi Reichweite: Remote
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
JSON Duality DML verkettet JSON-String-Werte mit escape_string_for_mysql (nur Backslash) und führt dann parse_sql unter dem Invoker-sql_mode aus, nachdem auf den View-DEFINER-sctx umgeschaltet wurde. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' bewirkt, dass \' das SQL-Literal beendet. Ein JSON-String, der ' enthält, injiziert eine Subquery / SET-Liste als DEFINER. Lab: Invoker mit ausschließlich DML auf der View liest secret.s in die projizierte Spalte name.
Das Standard-CREATE VIEW ist DEFINER. Das X Plugin verzweigt bereits auf diesen Modus. JDV nicht. Feature-gated: benötigt eine JSON Duality View.
| ID | noch keine CVE |
| Klasse | SQLi (DEFINER; kein RCE) |
| Reichweite | Remote (authentifiziertes SQL; benötigt DML auf einer 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 |
| Produkt | MySQL Community Server mysqld |
| Betroffen | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | authentifiziert; INSERT oder UPDATE auf einer JSON Duality View |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1. Nachweis in projiziertem $.name. |
DML auf einer SQL SECURITY DEFINER JSON Duality View besitzen. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'. UPDATE (Etag aus SELECT) eines String-Felds, dessen JSON-Wert ' enthält. Das generierte _utf8mb4 '...'-Literal endet. Der Rest der Anweisung läuft als DEFINER. Das Lab selektiert secret.s.note in die projizierte Spalte name. Direktes SELECT auf secret.s ist 1142.
Ohne diesen sql_mode wird dasselbe JSON als literaler Name gespeichert. Das Anführungszeichen bleibt Daten.
Dieselbe 26.7.0-Jagd. Standard-Daemon ohne veröffentlichte Crit/High war leer. JSON Duality DML verkettet weiterhin Werte.
sbuf.append("_utf8mb4 '");
escape_string_for_mysql(&my_charset_utf8mb4_bin, ...);
sbuf.append(1, '\'');
create_sctx_guard installiert view_sctx vor run_substmt. Der Invoker-sql_mode ist das, was parse_sql sieht.
Irrwege: SQL SECURITY DEFINER zwischen dem View-Namen und AS ist 1064 (Standard ist bereits DEFINER). Derselbe name wie die aktuelle Zeile wird übersprungen (is_equal); gegen einen anderen Wert injizieren. Etag ist erforderlich.
cd lab
./run.sh
Image mysql:26.7.0. Veröffentlicht 127.0.0.1:18640. View app.dv DEFINER root@% über app.t. Secret in secret.s. Opfer hat nur SELECT/INSERT/UPDATE auf der 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
JDV-DML-Strings mit demselben NO_BACKSLASH_ESCAPES-Zweig escapen, den das X Plugin bereits hat (escape_sql_quote vs escape_string_for_mysql). Das generierte INSERT/UPDATE parametrisieren. Verkettete Werte nicht unter einem DEFINER-sctx parse_sql unterziehen.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard