
phpMyAdmin 5.2.3 - 높음 - 원격 - 2FA 우회 - WebAuthn 인증 과정을 건너뛸 수 있음
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
분류: 2FA 우회 도달 범위: 원격
phpMyAdmin 5.2.3 (태그 RELEASE_5_2_3). 기본 tarball. web-auth/webauthn-lib는 suggest / require-dev입니다. composer install --no-dev는 이를 설치하지 않습니다. 따라서 createServer는 CustomServer를 사용합니다. 해당 클래스는 response.signature를 파싱하고(필드가 존재하고 디코딩되어야 함) 절대 COSE 검증을 하지 않습니다. 저장된 credentialPublicKey를 절대 사용하지 않습니다. 제품 자체의 CustomServerTest는 공개 키 없이 assertion을 허용합니다.
구조적 검사는 실제로 수행됩니다: allowCredentials 내 credential id, clientData.type == webauthn.get, 세션과 일치하는 challenge, origin host, rpIdHash, user-present. 서명은 파싱되고 무시됩니다. MySQL 비밀번호 이후, 해당 필드들과 여전히 일치하는 쓰레기 WebAuthn 서명은 완전한 phpMyAdmin 세션을 부여합니다. 그것이 데이터베이스입니다. 실제로 web-auth/webauthn-lib를 설치했다면, WebauthnLibServer를 사용하는 것이며 이 버그에 해당하지 않습니다.
| ID | 아직 CVE 없음 |
| 분류 | 2FA 우회 / 서명 검증 누락 |
| 도달 범위 | 원격 (쿠키 로그인 후 WebAuthn 건너뜀) |
| CWE | CWE-347, CWE-287 |
| CVSS | High: 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. 기본 tarball / composer install --no-dev |
| 인증 | 쿠키 로그인 (MySQL 비밀번호) 후 WebAuthn 건너뜀 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18080 전용 |
여전히 MySQL 비밀번호(쿠키 로그인)가 필요합니다. 그 비밀번호 이후, 일치하는 challenge, origin host, rpIdHash, user-present, 등록된 credential id, 그리고 쓰레기 서명을 담아 webauthn_request_response를 POST합니다. 그러면 정상 UI에 진입합니다. 2FA는 사라집니다. 그것은 데이터베이스(SQL, 사용자, 내보내기)이며, 호스트 상의 PHP 셸이 아닙니다.
실제로 web-auth/webauthn-lib를 설치했다면, WebauthnLibServer를 사용하는 것이며 이 버그에 해당하지 않습니다.
| 권한 | 메서드 / 경로 | 랩 입증 또는 추정 |
|---|---|---|
| 인증자 없이 WebAuthn 2FA 완료 (2차 인증 요소의 무결성) | 비밀번호 후 POST webauthn_request_response, 쓰레기 서명 | 랩 입증. still_2fa=False landed=True |
| 해당 MySQL 사용자로서의 전체 PMA (무결성 + SQL 박스 정찰) | 동일 세션 | 랩 입증. 홈 UI 마커 존재 |
| MySQL 비밀번호 건너뛰기 | 인증되지 않은 POST | 랩 입증, 차단됨. 로그인 화면 유지 |
web-auth/webauthn-lib가 설치된 상태에서 동일 우회 | WebauthnLibServer | 차단됨. 이 잔여 버그 아님 |
| OS RCE / 리버스 셸 | 이 잔여 버그 | 차단됨 |
이 잔여 버그에서 차단된 것: 인증되지 않은 PMA, 호스트 상의 PHP 셸, 그리고 실제로 web-auth/webauthn-lib를 설치한 tarball을 이 버그로 취급하는 것.
createServer를 읽고, 그다음 parseAndValidateAssertionResponse를 읽고, 그다음 공개 키를 전달하지 않는 단위 테스트를 읽었습니다. 구조적 검사는 실제로 수행됩니다. 서명은 파싱되고 무시됩니다.
잘못된 시도들: 사전 비밀번호 세션 없이 WebAuthn JSON을 POST; 구조적 검사를 통과하지 못한 서명; Webauthn\Server가 여전히 존재(잘못된 서버 클래스); 이 세션에서 나오지 않은 challenge; origin host 불일치; user-present 플래그 해제; allowCredentials에 없는 credential id.
랩 Dockerfile은 5.2.3을 복사하고, composer install --no-dev를 실행한 뒤, vendor/web-auth를 삭제하여 CustomServer가 사용되도록 합니다. 마지막 php -r은 Webauthn\Server가 존재하면 종료 코드 1로 종료됩니다. init.sql은 하드웨어 키 없이 appuser에 대해 WebAuthn 2FA를 등록합니다. PoC는 서명 not-a-real-signature-PMA-WEBAUTHN-BYPASS를 POST합니다.
Dockerfile 옆에 핀을 클론한 뒤 실행하세요:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
또는 해당 클론 후 팩 루트에서:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
루프백 전용: http://127.0.0.1:18080. Compose 프로젝트 pma-webauthn-lab. 핀 RELEASE_5_2_3. src/를 배포하지 마세요. 증거 PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
저장된 COSE 공개 키로 authenticatorData || SHA-256(clientDataJSON)을 검증하세요; userHandle을 바인딩하세요; signCount를 강제하세요. web-auth/webauthn-lib를 실제 의존성으로 만들고 CustomServer를 삭제하거나, 라이브러리가 없으면 fail closed로 처리하세요. 그때까지는 WebAuthn 2FA를 비활성화하거나 이 phpMyAdmin을 노출하지 마세요.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.