
phpMyAdmin 5.2.3 - 높음 - 원격 - 2FA - config/set이 2단계 인증을 초기화함
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
분석 문서: https://abraxaslabs.tech/research/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 토큰 필요. 지속적인 2FA 제거로 이어지는 XSS 또는 CSRF를 완성함 |
| 라이선스 | 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. 랩에서는 하드웨어 키 없이 Settings에서 Simple 백엔드를 등록할 수 있도록 $cfg['DBG']['simple2fa']만 켭니다. TOTP와 WebAuthn은 동일한 2fa preference 키에 있습니다.
SetConfigController는 key와 JSON value를 받아 Config::setUserValue를 호출합니다. UserPreferences::persistOption은 "No validation is done!"이라고 문서화되어 있습니다. apply()는 2fa를 허용 목록에 포함시켜 해당 키가 알 수 없는 pref로 제거되지 않도록 합니다.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null')는 PHP null입니다. persistOption('2fa', null, $default)는 해당 경로의 기본값도 null이기 때문에 config_data['2fa']를 unset합니다.
Settings -> Two-factor는 대조적입니다. TwoFactorController는 TwoFactor::check(true)가 true를 반환할 때까지 configure('')를 하지 않습니다.
이미 기록된 잘못된 해석: Settings 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)를 요구합니다. Settings 경로만 유일한 기록자로 유지합니다.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 실습 환경 전용입니다. 보증은 제공되지 않습니다.