
phpMyAdmin 5.2.3 - 높음 - 원격 - 잔여 - isSuperUser 검사 건너뜀
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-issuperuser
분석 문서: https://abraxaslabs.tech/research/phpmyadmin-issuperuser
분류: 권한 잔여물 도달 범위: 원격
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
DatabaseInterface::isSuperUser()는 SUPER / SYSTEM_USER 검사가 아닙니다. 이는 SELECT 1 FROM mysql.user LIMIT 1입니다. mysql.user를 읽을 수 있는 모든 계정은 세션의 나머지 동안 슈퍼유저로 캐시됩니다. $cfg['AllowUserDropDatabase']의 기본값은 false입니다. DestroyController, SqlController, ImportController, 그리고 데이터베이스 페이지는 모두 해당 플래그를 우회하여 isSuperUser 지름길을 사용합니다.
새로운 MySQL 권한이 아닌 phpMyAdmin 정책 우회입니다. mysql.user에 대한 SELECT와 DROP 권한이 있고 SUPER가 없어도 PMA를 통해 Drop을 수행할 수 있습니다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여물 |
| 도달 범위 | 원격 (MySQL 계정으로 인증된 쿠키 로그인) |
| CWE | CWE-863 |
| CVSS | 중간: 6.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L |
| 제품 | phpMyAdmin |
| 영향 받는 버전 | 5.2.3 태그 RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| 인증 | MySQL 계정으로 인증된 쿠키 로그인 |
| 라이선스 | GNU Affero GPL v3.0 |
| 실습 환경 | 127.0.0.1 전용 |
mysql.user를 읽을 수 있고(일반적인 백업/모니터링 SELECT) SUPER 없이 DROP 권한을 가진 로그인된 MySQL 계정은 phpMyAdmin 슈퍼유저로 취급됩니다.
| 권한 | 메서드 / 싱크 | 정찰 / 무결성 / 가용성 | 실습 환경 입증 또는 추론 |
|---|---|---|---|
$cfg['AllowUserDropDatabase']=false를 우회하고 데이터베이스 페이지에서 Drop 표시 | GET index.php?route=/server/databases | Drop UI 정찰 | 실습 환경 입증. selectuser의 경우 bulkActionDropButton / selected_dbs[] 존재, plaindrop의 경우 부재 |
| PMA destroy 핸들러를 통해 데이터베이스 삭제 | POST index.php?route=/server/databases/destroy selected_dbs[]=dropme ajax_request=true | 해당 데이터베이스의 무결성 / 가용성 | 실습 환경 입증. JSON success:true, "1 database has been dropped successfully." dropme 사라짐 |
SQL 상자에서 DROP DATABASE 실행 | POST index.php?route=/sql sql_query=DROP DATABASE \dropme_sql`` | 해당 데이터베이스의 무결성 / 가용성 | 실습 환경 입증. 데이터베이스 사라짐. 부정 계정은 "DROP DATABASE statements are disabled." 메시지 수신 |
isSuperUser()로 제한된 다른 PMA 화면 잠금 해제 | 권한, 복제, 상태, 사용자 그룹, 엔진, binlog, 변수 | 해당 화면의 정찰 / 무결성 | 호출 지점에서 추론. 실행하지 않음 |
mysql.user 읽기 | PMA가 SUPER 오라클로 사용하는 MySQL SELECT | PMA가 SUPER로 오인하는 카탈로그 정찰 | 실습 환경 입증. 해당 권한 부여가 잔여물이 SUPER로 오인하는 원인 |
이 실습 환경에서 배제된 것: 실제 MySQL SUPER (SHOW GRANTS는 USAGE + 테이블 DROP + mysql.user에 대한 SELECT로 유지됨). FILE, GRANT OPTION, shutdown, ALL PRIVILEGES는 부여되지 않음. DROP은 있지만 mysql.user에 대한 SELECT가 없는 계정은 여전히 PMA를 통해 drop할 수 없음. 이는 새로운 MySQL 권한이 아니며 RCE도 아님.
동일 핀: WebAuthn CustomServer 잔여물.
phpMyAdmin RELEASE_5_2_3을 고정했습니다. SUPER처럼 말하는 권한 게이트는 SUPER처럼 보여야 합니다. 이것은 카탈로그 SELECT처럼 보입니다:
$result = $this->tryQuery('SELECT 1 FROM mysql.user LIMIT 1');
$isSuperUser = false;
if ($result) {
$isSuperUser = (bool) $result->numRows();
}
SessionCache::set('is_superuser', $isSuperUser);
AllowUserDropDatabase(기본값 false) 플래그를 처리하는 게이트:
Controllers/Server/DatabasesController.php is_drop_allowedControllers/Server/Databases/DestroyController.php (AJAX destroy)Controllers/Sql/SqlController.php / Sql::hasNoRightsToDropDatabaseControllers/Import/ImportController.phpControllers/Database/OperationsController.php이미 기록된 잘못된 방향: 실제 MySQL SUPER를 주장하는 것; DROP 전용 계정을 버그로 취급하는 것(그 계정은 음성 대조군임); 이를 RCE로 과장하는 것; 리버스 셸. 쇼에 불과함.
python3 phpmyadmin-issuperuser-Abraxas-Labs.py
# or: cd lab && ./run.sh
오직 http://127.0.0.1:19270만 대상으로 합니다. 이미지 phpmyadmin:5.2.3 및 mysql:8.0. Compose 프로젝트 phpmyadmin-issuperuser. $cfg['AllowUserDropDatabase']=false. 실행 후 스택은 종료됩니다.
selectuser는 mysql.user에 대한 SELECT 권한과 dropme / dropme_sql에 대한 DROP 권한을 가지며, SUPER 권한은 없습니다. plaindrop은 nodropme에 대한 DROP 권한만 가집니다. Databases 페이지는 selectuser에 대해 Drop을 표시합니다. POST /server/databases/destroy는 dropme를 삭제합니다. DROP DATABASE dropme_sql을 사용한 POST /sql도 실행됩니다. plaindrop은 여전히 destroy로부터 Error JSON을, /sql로부터 "DROP DATABASE statements are disabled"를 받았습니다.
SUCCESS phpmyadmin-issuperuser drop-ui=yes destroy=ok sql-drop=ok grants-no-super=yes mysql.user-select=yes neg-drop-ui=no neg-destroy=denied PMA-ISSUPERUSER-WITNESS
INFORMATION_SCHEMA 또는 SHOW GRANTS를 통해 실제 SUPER / SYSTEM_USER를 테스트하세요. 해당 카탈로그가 실제로 필요한 UI를 위해 별도의 "mysql.user를 읽을 수 있음" 플래그를 유지하세요. 카탈로그 SELECT를 슈퍼유저로 캐시하지 마세요.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/DatabaseInterface.php isSuperUser()GNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 실험실 전용입니다. 보증은 제공되지 않습니다.