
phpMyAdmin 5.2.3 - 높음 - 원격 - 잔여 - isSuperUser 검사 건너뜀
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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, 그리고 databases 페이지는 모두 해당 플래그를 우회하여 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를 우회하고 databases 페이지에서 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 화면 잠금 해제 | Privileges, replication, status, user groups, engines, binlog, variables | 해당 화면의 정찰 / 무결성 | 호출 지점에서 추론. 실행되지 않음 |
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를 통해 삭제할 수 없다. 이는 새로운 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 참조. 루프백 랩 전용. 보증 없음.