
MySQL Community Server 26.7.0 - High - mysqldump --tab 경로 잔여물 - 클라이언트 파일 쓰기
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-tab-path
분류: 파일 쓰기 (클라이언트) 도달 범위: 원격 (UI:R)
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
mysqldump --tab=DIR은 MY_REPLACE_DIR 없이 fn_format을 사용하여 테이블당 하나의 .sql을 작성합니다. / 또는 ..가 포함된 악의적인 SHOW TABLES 이름은 해당 디렉터리를 유지합니다. DIR은 무시됩니다. 덤프 UID가 해당 경로를 my_fopen합니다.
--tab은 .txt가 서버 INTO OUTFILE을 거치기 때문에 동일 머신 모드로 문서화되어 있습니다. .sql은 여전히 클라이언트 쓰기입니다.
| ID | 아직 CVE 없음 |
| 분류 | 파일 쓰기 (클라이언트 --tab .sql) |
| 도달 범위 | 원격 (피해자가 공격자 MySQL을 대상으로 mysqldump --tab 실행; UI:R) |
| CWE | CWE-22 |
| CVSS | 높음: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| 제품 | MySQL Community Server mysqldump |
| 영향받는 버전 | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| 인증 | 피해자가 공격자 MySQL을 대상으로 mysqldump --tab=DIR 실행 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용. DIR 외부의 .sql 증거 확인. |
MySQL 프로토콜 서버를 세웁니다. SHOW TABLES에 /abs/path 또는 ../outside로 응답합니다. mysqldump --tab=/backup testdb를 실행한 운영자는 덤프 UID로 /abs/path.sql(또는 cwd 기준 상대 경로)을 작성하게 됩니다.
해당 UID가 생성할 수 있는 모든 파일을 덮어쓸 수 있습니다. 원격 파일 이름을 신뢰하는 백업 클라이언트와 동일한 부류입니다. .txt INTO OUTFILE 경로는 서버 측 FILE입니다. 남는 것은 클라이언트 .sql입니다.
실제 mysqld는 /가 포함된 테이블 이름을 내보내지 않습니다. 남는 것은 클라이언트입니다.
mysqldump SHOW TABLES 오버플로와 동일한 26.7.0 사냥입니다. 기본 데몬은 비어 있었습니다. 클라이언트 도구들은 여전히 SHOW TABLES를 신뢰했습니다. 오버플로가 하나의 잔여물이었습니다. --tab이 그다음이었습니다.
static FILE *open_sql_file_for_table(const char *table, int flags) {
FILE *res;
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
convert_dirname(tmp_path, path, NullS);
res = my_fopen(fn_format(filename, table, tmp_path, ".sql",
MYF(MY_UNPACK_FILENAME | MY_APPEND_EXT)),
flags, MYF(MY_WME));
return res;
}
mysys/mf_format.cc: dirname_part(name)이 비어 있지 않고 MY_REPLACE_DIR가 꺼져 있으면 주어진 dir은 사용되지 않습니다.
이미 기록된 잘못된 접근: 실제 mysqld를 오라클로 취급; SHOW CREATE TABLE 전에 SHOW TABLE STATUS에서 중단 (.sql은 CREATE가 성공한 후에만 열림); INTO OUTFILE .txt를 잔여물로 지칭; G1 오버플로를 다시 건드리는 64KiB 이름.
MariaDB CVE-2025-13699(mariadb-dump 뷰 이름 트래버설)가 아닙니다. 동일한 부류, MySQL Community 사본입니다.
cd lab
./run.sh
이미지 mysql:26.7.0. --tab=/work/tabdir. 대조 스텁 테이블 t는 work/tabdir/t.sql을 작성합니다. 트래버설 스텁 테이블 /work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS는 work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS.sql을 작성합니다. 공개된 127.0.0.1:18610 / 18611. 루프백에 바인딩하십시오.
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
--tab 클라이언트 파일에 대해 fn_format에 MY_REPLACE_DIR를 전달하거나, 먼저 테이블 이름의 basename을 취하십시오. --tab=DIR은 DIR을 의미해야 합니다.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc