
phpMyAdmin 5.2.3 - 높음 - 원격 - 2FA - config/set이 2단계 인증을 초기화함
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
분류: 권한 잔존 / 단계 상향 누락 도달 범위: 원격
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
POST index.php?route=/config/set은 2fa를 포함한 허용 목록의 모든 환경설정을 기록한다. UserPreferences::persistOption은 아무런 검증도 하지 않는다. 설정 -> 2단계 인증은 여전히 인증 요소를 제거하기 전에 TwoFactor::check(true)를 호출한다. /config/set은 그렇지 않다.
로그인된 세션, 또는 페이지 토큰을 POST할 수 있는 XSS/CSRF는 key=2fa와 value=null을 전송할 수 있다. 다음 비밀번호 로그인에는 TOTP, WebAuthn, Simple 프롬프트가 없다. 일회성 건너뛰기가 아닌 지속적인 제거다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔존 / 단계 상향 누락 |
| 도달 범위 | 원격 (인증된 쿠키 로그인, CSRF 토큰 필요) |
| CWE | CWE-620 |
| 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) |
| 인증 | 쿠키 로그인. CSRF 토큰 필요. XSS 또는 CSRF를 지속적인 2FA 제거로 완성 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
TOTP, WebAuthn, 또는 Simple 확인 필드를 제시하지 않고 phpMyAdmin 계정에서 2FA를 제거한다. 다음 비밀번호 로그인은 비밀번호만으로 이루어진다. 해당 MySQL 사용자로서의 전체 PMA (SQL, 사용자, 내보내기).
| 권한 | 메서드 / 경로 | 정찰 / 무결성 / 가용성 | 랩 입증 또는 추론 |
|---|---|---|---|
2fa를 null로 지속시키고 pmadb에서 두 번째 인증 요소 제거 | 인증된 POST index.php?route=/config/set key=2fa value=null 및 유효한 token | 환경설정 저장소의 무결성 | 랩 입증. success:true, pmadb config_data가 []가 됨 |
| 해당 쓰기 이후 비밀번호만으로 로그인 | 새 쿠키 세션, 동일 MySQL 사용자 | 로그인 경로의 무결성 | 랩 입증. 2fa_confirm 없음, 정상 UI 진입 |
| 이후 로그인에서 2FA가 사라지는 동안 현재 세션 유지 | 동일 핸들러; persistOption은 저장소를 기록하며 라이브 two_factor_check 플래그가 아님 | 이후 세션의 무결성 | 랩 입증. 세션 A는 유지됨. 세션 B는 2FA를 보았음. 세션 C는 보지 못함 |
| 페이지 토큰으로 POST할 수 있는 저장형 XSS 또는 CSRF로부터의 연쇄 | 동일 검토의 잔존 항목, 이 랩 아님 | 동일 출처 POST 이후 2FA의 무결성 | 추론 |
| 설정을 통한 2FA 제거 | POST /preferences/two-factor 2fa_remove=1 | 문서화된 UI를 통한 2FA의 무결성 | 랩 입증 폐쇄. 인증 요소 없이는 PMA가 확인 페이지를 표시하고 pmadb에는 여전히 backend=simple이 있음 |
이 잔존 항목에서 폐쇄된 것: 인증되지 않은 접근, MySQL 비밀번호 건너뛰기, OS RCE, 다른 사용자의 pmadb 행 읽기. 잔존 항목 #1 (CustomServer 서명)은 필요하지 않았다. MySQL 비밀번호를 건너뛰지 않았다.
동일 핀: WebAuthn CustomServer 잔존 항목.
PMASA-2025-1/2/3 이후 5.2.3을 고정했다. 쿠키 인증, pmadb pma__userconfig. 랩은 하드웨어 키 없이 설정에서 Simple 백엔드를 등록할 수 있도록 $cfg['DBG']['simple2fa']만 활성화한다. TOTP와 WebAuthn은 동일한 2fa 환경설정 키에 있다.
SetConfigController는 key와 JSON value를 받아 Config::setUserValue를 호출한다. UserPreferences::persistOption은 "검증이 수행되지 않음!"으로 문서화되어 있다. apply()는 2fa를 허용 목록에 포함하므로 해당 키가 알 수 없는 환경설정으로 제거되지 않는다.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null')은 PHP null이다. persistOption('2fa', null, $default)는 해당 경로의 기본값도 null이므로 config_data['2fa']를 해제한다.
설정 -> 2단계 인증은 대조적이다. TwoFactorController는 TwoFactor::check(true)가 true를 반환할 때까지 configure('')를 하지 않는다.
이미 기록된 잘못된 방향: 설정 2fa_remove를 취약점으로 취급 (여전히 인증 요소를 요구함); 인증되지 않은 접근 주장; MySQL 비밀번호 건너뛰기 주장; 이를 잔존 항목 #1 (CustomServer)로 취급; 리버스 셸. 연극.
python3 phpmyadmin-config-set-2fa-Abraxas-Labs.py
# or: cd lab && ./run.sh
대상은 오직 http://127.0.0.1:19280. Compose 프로젝트 phpmyadmin-config-set-2fa. RELEASE_5_2_3 고정. run.sh는 이미지를 위해 해당 태그를 lab/src/로 복사하거나 클론한다. 실행 후 스택은 해체된다.
설정에서 Simple 2FA를 등록했다. 두 번째 브라우저가 2fa_confirm 페이지에 접속했다. 인증 요소 없이 2fa_remove를 POST하면 확인 UI에 머물고 pmadb에 backend=simple이 남았다. 이후 /config/set을 POST하면 success:true를 반환하고 pmadb가 []가 되었으며, 다음 로그인은 정상 UI에 진입했다.
SUCCESS phpmyadmin-config-set-2fa enroll=simple ui-remove-blocked=yes config-set-cleared=yes next-login-password-only=yes PMA-CONFIG-SET-2FA-WITNESS
/config/set에서 2fa (및 기타 인증 키)를 거부한다. 모든 2FA 변경 전에 TwoFactor::check(true)를 요구한다. 설정 경로를 유일한 기록자로 유지한다.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.