
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
Class: SQLi Reach: Remote
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
JSON Duality DML は JSON 文字列値を escape_string_for_mysql (バックスラッシュのみ) で連結し、その後、ビューの DEFINER sctx に切り替えた上で、呼び出し元の sql_mode の下で parse_sql を実行する。SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' により、\' が SQL リテラルを終了させる。' を含む JSON 文字列は、DEFINER としてサブクエリ / SET リストを注入する。ラボ: ビューに対する DML のみを持つ呼び出し元が、secret.s を射影された name カラムに読み出す。
デフォルトの CREATE VIEW は DEFINER である。X Plugin は既にそのモードで分岐している。JDV はそうではない。機能ゲートあり: JSON Duality View が必要。
| ID | CVE 未割当 |
| Class | SQLi (DEFINER; RCE ではない) |
| Reach | Remote (認証済み SQL; JSON Duality View に対する DML が必要) |
| 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 |
| Product | MySQL Community Server mysqld |
| Affected | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | 認証済み; JSON Duality View に対する INSERT または UPDATE |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ。射影された $.name に証拠あり。 |
SQL SECURITY DEFINER の JSON Duality View に対する DML を保持する。SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'。JSON 値に ' を含む文字列フィールドを (SELECT で取得した etag を使って) UPDATE する。生成された _utf8mb4 '...' リテラルが終了する。ステートメントの残りは DEFINER として実行される。ラボでは secret.s.note を射影された name カラムに SELECT する。secret.s への直接 SELECT は 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 は run_substmt の前に view_sctx をインストールする。呼び出し元の sql_mode が parse_sql の見るものである。
誤った方向: ビュー名と AS の間の SQL SECURITY DEFINER は 1064 となる (デフォルトは既に DEFINER)。現在の行と同じ name はスキップされる (is_equal)。異なる値に対して注入すること。Etag は必須。
cd lab
./run.sh
イメージ mysql:26.7.0。公開 127.0.0.1:18640。ビュー app.dv は app.t 上の DEFINER root@%。シークレットは 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 文字列を、X Plugin が既に持つ同じ NO_BACKSLASH_ESCAPES 分岐 (escape_sql_quote 対 escape_string_for_mysql) でエスケープする。生成される INSERT/UPDATE をパラメータ化する。DEFINER sctx の下で連結された値に対して parse_sql を行わない。
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard