
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
분류: SQLi 도달 범위: 원격
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 없음 |
| 분류 | SQLi (DEFINER; RCE 아님) |
| 도달 범위 | 원격 (인증된 SQL; JSON Duality View에 대한 DML 필요) |
| CWE | CWE-89 |
| CVSS | 높음: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 제품 | MySQL Community Server mysqld |
| 영향받는 버전 | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| 인증 | 인증됨; JSON Duality View에 대한 INSERT 또는 UPDATE |
| 라이선스 | GNU Affero GPL v3.0 |
| 실습 | 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 vs escape_string_for_mysql)로 이스케이프하라. 생성된 INSERT/UPDATE를 매개변수화하라. DEFINER sctx에서 연결된 값을 parse_sql하지 마라.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard