phpMyAdmin 5.2.3 - 높음 - 원격 - SQLi - 인증 플러그인 식별자 미인용
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Class: SQLi Reach: Remote
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 없음 |
| Class | SQLi |
| Reach | Remote (인증된 쿠키 로그인, 비밀번호 변경 켜짐) |
| CWE | CWE-89 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Product | phpMyAdmin |
| Affected | 5.2.3 태그 RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | 인증된 쿠키 로그인. $cfg['ShowChgPassword'] 기본값 true. 인증 유형은 config가 아님 |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 전용 |
로그인한 phpMyAdmin 사용자가 비밀번호 변경 폼을 통해 자신의 ALTER USER에 SQL을 주입할 수 있습니다.
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven or inferred |
|---|---|---|---|
IDENTIFIED WITH에 추가 SQL 전송 | POST index.php?route=/user-password with authentication_plugin | phpMyAdmin이 생성하는 구문의 무결성 | Lab-proven. Raw POST sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/가 SQL 박스에 따옴표 없이 나타남 |
| MySQL이 그 추가 SQL을 SQL로 파싱하게 함 | 동일 구문이 mysqld에 도달 | 사용자 연결의 무결성 | Lab-proven. General log가 플러그인 sha256_password를 유지하고 주석을 버림. 이 사용자에게 CREATE USER 권한이 없어 1227 발생 |
| 탈출이 파싱되면 추가 절 또는 추가 계정 | 동일 sink; 스택 쿼리는 드라이버에 의존 | 다른 계정의 무결성 | Inferred. 이 랩은 두 번째 구문을 실행하거나 다른 계정을 생성하지 않음 |
| add/edit user에서 동일한 concat | Privileges.php IDENTIFIED WITH / MariaDB VIA | 권한 부여자가 생성한 구문의 무결성 | Inferred sibling. 랩 POST는 비밀번호 변경 전용 |
이 경로에서 제외된 것: 비인증 사용(쿠키 로그인 필요), config-auth(비밀번호 변경이 숨겨짐), RCE, MySQL 8에서 GRANT 없이 플러그인 변경 성공(1227 without CREATE USER). 사용자 이름, 호스트, 비밀번호는 이스케이프된 상태로 유지됩니다. 자신의 비밀번호에는 GRANT가 필요하지 않습니다. 남는 것은 자유로운 플러그인 교체가 아니라 따옴표 처리되지 않은 플러그인 필드입니다.
동일 핀: WebAuthn CustomServer leftover.
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을 leftover의 실패로 취급(이는 추가 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 참조. 루프백 랩 전용. 보증 없음.