
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 Alcance: Remoto
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
O JSON Duality DML concatena valores de string JSON com escape_string_for_mysql (apenas backslash), depois parse_sql sob o sql_mode do invocador após trocar para o sctx do DEFINER da view. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES' faz com que \' encerre o literal SQL. Uma string JSON contendo ' injeta uma subquery / lista SET como DEFINER. Lab: invocador com apenas DML na view lê secret.s para a coluna name projetada.
O CREATE VIEW padrão é DEFINER. O X Plugin já ramifica nesse modo. O JDV não. Condicionado por feature: precisa de uma JSON Duality View.
| ID | ainda sem CVE |
| Classe | SQLi (DEFINER; não RCE) |
| Alcance | Remoto (SQL autenticado; precisa de DML em uma 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 |
| Produto | MySQL Community Server mysqld |
| Afetado | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Autenticação | autenticado; INSERT ou UPDATE em uma JSON Duality View |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1. Testemunho em $.name projetado. |
Possuir DML em uma JSON Duality View SQL SECURITY DEFINER. SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'. UPDATE (etag do SELECT) em um campo string cujo valor JSON contém '. O literal _utf8mb4 '...' gerado termina. O restante da instrução é executado como DEFINER. O lab seleciona secret.s.note para a coluna name projetada. SELECT direto em secret.s é 1142.
Sem esse sql_mode o mesmo JSON é armazenado como um nome literal. A aspa permanece dado.
Mesma caçada do 26.7.0. Crit/High não publicados do daemon padrão estava vazio. O JSON Duality DML ainda concatena 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. O sql_mode do invocador é o que parse_sql vê.
Caminhos errados: SQL SECURITY DEFINER entre o nome da view e AS é 1064 (o padrão já é DEFINER). O mesmo name da linha atual é ignorado (is_equal); injete contra um valor diferente. O etag é obrigatório.
cd lab
./run.sh
Imagem mysql:26.7.0. Publicado 127.0.0.1:18640. View app.dv DEFINER root@% sobre app.t. Segredo em secret.s. A vítima tem apenas SELECT/INSERT/UPDATE na 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
Escape strings de DML do JDV com o mesmo ramo NO_BACKSLASH_ESCAPES que o X Plugin já possui (escape_sql_quote vs escape_string_for_mysql). Parametrize o INSERT/UPDATE gerado. Não faça parse_sql de valores concatenados sob um sctx DEFINER.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard