phpMyAdmin 5.2.3 - 높음 - 원격 - SQLi - 인증 플러그인 식별자 미인용
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
분석 문서: https://abraxaslabs.tech/research/phpmyadmin-auth-plugin-unquoted
분류: SQLi 도달 범위: 원격
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
비밀번호 변경은 기본적으로 활성화되어 있습니다. UserPassword.php는 POST의 authentication_plugin을 허용 목록도, 따옴표 처리도 없이 ALTER USER ... IDENTIFIED WITH에 복사합니다. 같은 구문에 있는 사용자 이름, 호스트, 비밀번호는 escapeString을 거칩니다. MySQL 8에서는 게시된 플러그인이 현재 플러그인과 다를 때 WITH 절이 출력됩니다.
로그인한 phpMyAdmin 사용자는 비밀번호 변경 폼을 통해 자신의 ALTER USER에 SQL을 주입합니다. 플러그인 필드에 들어간 추가 SQL은 플러그인 이름이 아니라 SQL입니다.
| ID | 아직 CVE 없음 |
| 분류 | SQLi |
| 도달 범위 | 원격 (인증된 쿠키 로그인, 비밀번호 변경 활성화) |
| 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 |
| 제품 | phpMyAdmin |
| 영향받는 버전 | 5.2.3 태그 RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| 인증 | 인증된 쿠키 로그인. $cfg['ShowChgPassword'] 기본값 true. 인증 유형이 config가 아님 |
| 라이선스 | GNU Affero GPL v3.0 |
| 실습 환경 | 127.0.0.1 전용 |
로그인한 phpMyAdmin 사용자는 비밀번호 변경 폼을 통해 자신의 ALTER USER에 SQL을 주입할 수 있습니다.
| 권한 | 방법 / 싱크 | 정찰 / 무결성 / 가용성 | 실습 환경 입증 또는 추론 |
|---|---|---|---|
IDENTIFIED WITH에 추가 SQL 전송 | authentication_plugin을 포함한 POST index.php?route=/user-password | phpMyAdmin이 구성하는 구문의 무결성 | 실습 환경 입증. 원시 POST sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/가 SQL 박스에 따옴표 없이 나타남 |
| MySQL이 해당 추가 SQL을 SQL로 파싱하도록 함 | 동일 구문이 mysqld에 도달 | 사용자 연결의 무결성 | 실습 환경 입증. General log에 플러그인 sha256_password가 유지되고 주석은 제거됨. 이 사용자에게 CREATE USER 권한이 없어 1227 발생 |
| 탈출이 파싱될 경우 추가 절 또는 추가 계정 | 동일 싱크; 스택 쿼리는 드라이버에 따라 다름 | 다른 계정의 무결성 | 추론. 이 실습 환경은 두 번째 구문을 실행하거나 다른 계정을 생성하지 않음 |
| 사용자 추가/편집 시 동일한 문자열 연결 | Privileges.php의 IDENTIFIED WITH / MariaDB의 VIA | 권한 부여자가 구성한 구문의 무결성 | 추론된 유사 경로. 실습 환경의 POST는 비밀번호 변경에 한정됨 |
이 경로에서 차단된 것: 비인증 사용(쿠키 로그인 필요), config 인증(비밀번호 변경이 숨겨짐), RCE, MySQL 8에서 GRANT 없이 플러그인 변경 성공(1227, CREATE USER 없음). 사용자 이름, 호스트, 비밀번호는 이스케이프된 상태로 유지됩니다. 자신의 비밀번호 변경에는 GRANT가 필요하지 않으며, 남은 문제는 자유로운 플러그인 교체가 아니라 따옴표 처리되지 않은 플러그인 필드입니다.
동일 고정 버전: WebAuthn CustomServer 잔여 문제.
phpmyadmin/phpmyadmin RELEASE_5_2_3을 고정했습니다. PMASA-2025-1/2/3은 이미 5.2.2에 포함되어 있습니다. 비밀번호 변경은 여전히 다음과 같이 구성됩니다:
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin는 $_POST['authentication_plugin']입니다. MySQL 5.7.37+ 및 8.0은 플러그인이 변경되지 않는 한 WITH를 생략합니다. 다른 이름을 POST하면 해당 절이 다시 나타납니다.
이미 기록된 잘못된 판단: MySQL 1227을 잔여물의 실패로 취급한 것(이는 추가 SQL이 파싱되었다는 증거임); MySQL 8에서 GRANT 없는 플러그인 변경을 주장한 것; config-auth를 범위 내로 취급한 것; 리버스 셸. 연극일 뿐입니다.
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
오직 http://127.0.0.1:19260만 대상으로 합니다. 이미지 phpmyadmin:5.2.3 및 mysql:8.0. Compose 프로젝트 phpmyadmin-auth-plugin-unquoted. 실행 후 스택은 종료됩니다.
appuser로 쿠키 로그인합니다. authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/로 /user-password에 POST합니다. PMA SQL 쿼리 상자: ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'. MySQL general log는 주석을 파싱하여 IDENTIFIED WITH 'sha256_password'를 저장합니다. 사용자 이름은 따옴표로 묶입니다.
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
SHOW PLUGINS에서 가져온 플러그인 이름을 허용 목록으로 제한합니다. POST 값을 IDENTIFIED WITH, VIA, plugin=에 절대 삽입하지 마십시오.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0. LICENSE를 참조하십시오. 루프백 실습 환경 전용입니다. 보증은 제공되지 않습니다.