
phpMyAdmin 5.2.3 - 높음 - 원격 - CSRF - /sql에서 토큰 제거
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-csrf-sql
Class: CSRF Reach: Remote
phpMyAdmin 5.2.3 (tag RELEASE_5_2_3, commit 962857e). Common.php는 checkTokenRequestParam 이전에 전역 변수로부터 PSR-7 요청을 생성한다. 불일치 시 Sanitize::removeRequestVars는 $_POST와 $_GET을 지우지만 그 스냅샷은 지우지 않는다. 그런 다음 $sql_query가 $request->getParsedBodyParam('sql_query')에서 복사된다. AJAX POST는 토큰 불일치 시 중단된다. 비 AJAX POST는 계속된다. SqlController는 제거된 $_POST['sql_query']를 우선하고, 그렇지 않으면 전역 변수를 유지한다.
phpMyAdmin 세션 쿠키를 가진 피해자만 있으면 충분하다. sql_query와 함께, 유효한 토큰 없이, ajax_request 없이 index.php?route=/sql로 POST하면 된다. SELECT는 해당 MySQL 사용자로 실행된다. 5.2.3의 기본 CookieSameSite=Strict는 많은 교차 사이트 브라우저를 차단한다. 동일 사이트, Lax, None, 또는 HTTP 인증은 여전히 취약하다. 어느 쪽이든 이것은 깨진 CSRF 제어이다.
| ID | 아직 CVE 없음 |
| Class | CSRF |
| Reach | Remote. 기본 CookieSameSite=Strict는 많은 교차 사이트 브라우저를 차단한다. 동일 사이트 / Lax / None / HTTP 인증은 여전히 남아 있다. |
| CWE | CWE-352 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| Product | phpMyAdmin |
| Affected | 5.2.3 tag RELEASE_5_2_3 (962857e) |
| Auth | 피해자 phpMyAdmin 세션 쿠키 (또는 HTTP 인증). 유효한 CSRF 토큰 없음. |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:19240 전용 |
피해자 브라우저가 ajax_request 없이 phpMyAdmin에 POST하도록 유도할 수 있는 사람은 누구나 해당 MySQL 사용자로 SQL을 실행할 수 있다.
| Privilege | Method / path | Lab-proven or inferred |
|---|---|---|
| 피해자 MySQL 계정으로 공격자 SQL 실행 (해당 SQL 박스의 무결성 + 정찰) | POST index.php?route=/sql sql_query=... db=... no token, no ajax_request | Lab-proven. 결과 본문에 PMA-CSRF-SQL-WITNESS 포함. General log에 appuser로 SELECT 기록됨 |
| AJAX에서 동일 핸들러 중단 | Same POST with ajax_request=1 | Lab-proven. Token mismatch. INSERT 마커 행 없음. General log에 해당 INSERT 실행되지 않음 |
제거된 $_POST만 읽는 핸들러 건너뛰기 | POST /database/structure/drop-table without a token | Lab-proven. keepme 여전히 존재 |
export (SaveDir), partition DROP/TRUNCATE, account lock, /config/set, pmadb create에서 동일한 갭 | 제거 후 PSR-7 본문을 읽는 모든 핸들러 | Inferred. 실행되지 않음 |
이 랩에서 닫힌 것: 인증되지 않은 PMA (먼저 쿠키 로그인 필요), AJAX 라우트 (불일치 시 종료됨), 토큰 없는 drop-table, OS shell. 기본 Strict SameSite는 고전적인 교차 사이트 폼이 종종 쿠키를 전송하지 않음을 의미한다. 남은 것은 동일 사이트 및 Lax/None 배포에서 여전히 실패한 CSRF 검사이다.
RELEASE_5_2_3의 8개 병렬 소스 탐색. Common.php는 checkTokenRequestParam() 이전에 $request = createFromGlobals()를 생성한다. 불일치 시 Sanitize::removeRequestVars()는 $_POST/$_GET만 지운다. 비 AJAX는 계속된다. SqlController는 $_POST가 비어 있으면 전역 $sql_query를 사용한다. 라우트 GET|POST /sql.
잘못된 방향: AJAX /sql을 잔여물로 취급 (Token mismatch로 중단됨); drop-table을 잔여물로 취급 (해당 핸들러는 제거된 $_POST만 읽음); 기본 Strict SameSite를 "CSRF가 닫혔다"로 취급 (제어는 여전히 깨져 있음; 동일 사이트 / Lax / None이 남아 있음).
python3 phpmyadmin-csrf-sql-Abraxas-Labs.py
또는
cd lab
./run.sh
루프백 전용: http://127.0.0.1:19240. 이미지 phpmyadmin:5.2.3 및 mysql:8.0. Compose 프로젝트 phpmyadmin-csrf-sql. PoC는 동일 사이트 루프백 POST이다 (Strict SameSite도 쿠키를 전송함). Witness PMA-CSRF-SQL-WITNESS.
SUCCESS phpmyadmin-csrf-sql sql-ran=yes ajax-abort=yes drop-held=yes PMA-CSRF-SQL-WITNESS
불일치 시 요청을 빈 본문으로 교체하거나, AJAX뿐만 아니라 모든 POST를 거부하라. 오래된 요청에서 sql_query를 복사하지 마라. logout처럼 fail closed하라.
962857e)libraries/classes/Common.php 토큰 제거 이전의 요청 스냅샷Sanitize::removeRequestVars는 $_POST/$_GET만 지움SqlController 전역 $sql_queryGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.