
WordPress 로그인의 반사형 HTML 인젝션(CVE-2026-64638)을 악용하여 사용자 정의 배너를 표시하는 자체 제출 HTML 트리거 페이지를 생성하며, 승인된 보안 테스트용입니다.
WordPress CVE-2026-64638의 wp-login.php(strip_tags() vs. KSES 파서 차이)에 대한 반사형 HTML 삽입을 위한 단일 파일, 무의존성 PoC 생성기입니다. 자동 제출 트리거 페이지를 생성합니다. 피해자가 파일을 열면 페이지가 조용히 삽입 페이로드를 POST하고, 피해자는 배너가 렌더링된 대상 로그인 페이지로 직접 이동합니다. 상호작용도, 대상 측 JavaScript도 필요 없습니다.
공인된 보안 테스트 전용입니다. 소유한 시스템 또는 명시적으로 테스트 권한을 부여받은 시스템에만 사용하십시오.
| 버전 | 상태 |
|---|
| 6.4.0 – 7.0.2 | 취약 — 기본 설정으로 동작 |
| 5.8 – 6.3 | 조건부 — style이 허용된 상태에서 login_errors를 wp_kses()에 통과시키는 플러그인 필요 |
| 4.7 – 5.7 | 악용 불가(사용자 이름이 반사되지 않음) |
| 6.4.9 / 6.5.9 / 6.6.6 / 6.7.6+ / 6.8.7 / 6.9.6 / 7.0.3+ | 패치됨(esc_html) |
python3 banner_poc.py \
--out trigger.html \
--target http://192.0.2.10/wp-login.php \
--msg "Scheduled System Maintenance"
# 하위 디렉터리 + 숨겨진 로그인 경로 + 부제목
python3 banner_poc.py \
--out trigger.html \
--target http://10.0.0.5:8080/blog/my-secret-login \
--msg "Please sign in again" --sub "Session expired"
trigger.html을 어디에든 호스팅하십시오. 피해자가 이를 열면 배너가 렌더링된 대상 로그인 페이지로 리디렉션됩니다. 전환은 조용합니다. 보이는 중간 콘텐츠가 없고, 배경이 WordPress 로그인 화면과 일치하며, 약 0.5초 내에 도착합니다.
| 플래그 | 설명 |
|---|---|
--out | 출력 HTML 파일(필수) |
--target | 전체 로그인 페이지 URL — 하위 디렉터리/숨겨진 로그인 경로 포함(필수) |
--msg | 배너 텍스트(기본값: Scheduled System Maintenance) |
--sub | 선택적 부제목 줄 |
wp-login.php는 실패한 로그인 사용자 이름을 오류 메시지에 반사합니다. 취약한 버전은 PHP strip_tags()로 이를 정화하는데, 이 함수는 < 뒤에 공백이 오는 모든 것을 통과시킵니다.< div style="...">는 실제 요소로 도착합니다.< /strong>(슬래시 앞에 공백)도 strip_tags()를 통과하며 실제 닫는 태그로 재구성되어, 페이로드가 첫 번째 토큰으로 템플릿의 <strong>(HTML5 활성 포맷 요소)을 닫고 정확한 DOM 제어를 유지할 수 있습니다.div가 템플릿의 끝 텍스트("… is not registered on this site …")를 삼킵니다.safecss_filter_attr()을 통과하는 class 없는 인라인 스타일을 사용합니다. 6.3+ / 6.4+에서는 position:fixed가 전체 페이지 오버레이를 렌더링하고, 5.8–6.2에서는 해당 속성이 제거되어 동일한 페이로드가 흐름 내 빨간 배너로 자동 저하됩니다.순수 HTML/CSS — 대상에서 실행되는 JavaScript가 없습니다. <script> 또는 이벤트 핸들러를 대상으로 하는 WAF 규칙은 적용되지 않습니다.
이 도구는 방어적 연구 및 공인된 침투 테스트를 위해 게시되었습니다. 저자는 오용에 대해 책임을 지지 않습니다.