
분석 및 종단 간 구현: 패치된 WordPress RCE 취약점 - CVE-2026-60137 및 CVE-2026-63030

모든 PoC는 동일한 두 가지 버그—REST 배치 라우트 혼동(CVE-2026-63030)과 author__not_in SQL 인젝션(CVE-2026-60137)—을 동일한 이중 중첩 배치 형태로 무기화합니다. 이들 간의 차이는 선택된 RCE 경로, 환경 전제 조건, 안전 기본값에 있습니다. 이 문서는 이 저장소의 구현이 해당 지형에서 어디에 위치하는지 구체적으로 설명합니다.
check는 명시적으로 요청하지 않는 한 SQL 페이로드를 보내지 않습니다. 모든 트래픽은 귀속 태그를 가질 수 있습니다. shell 명령이 대상에 기록하는 모든 것은 이후 자동으로 제거됩니다. §3 참조.| 기능 | 이 저장소 | Icex0/wp2shell-poc | sergiointel/wp2shell-poc | 0xsha/wp2shell | OUTFILE 변형 [4] |
|---|---|---|---|---|---|
| 사전 인증 블라인드/타이밍 SQLi 읽기 | 예 | 예 | 예 (타이밍) | 예 | 예 |
| 인밴드 UNION 읽기 (1 요청/값) | 예 | 예 | - [1] | - [1] | - |
| 오류 기반 읽기 (EXTRACTVALUE) | 예 | 예 | - | - | - |
| UNION 채널이 지속형 객체 캐시에서 생존 | 예 (제거된 베이스) | 아니오 - 프로브 거짓 음성 [2] | 문서화되지 않음 | 아니오 - 문서화된 전제 조건 [3] | 해당 없음 [5] |
| 크랙 없는 사전 인증 RCE | 예 (SQLi-to-admin 브리지) | 예 (동일 브리지) | 예 (브리지 원본) | 예 (동일 브리지) | 예, INTO OUTFILE을 통해 [5] |
| RCE를 위한 추가 전제 조건 | 기본 설치 외에 없음 | 없음 (객체 캐시 없는 호스트) | 없음 (동일) | 없음 (동일) | MySQL FILE 권한 + mysqld와 공유되는 웹 쓰기 가능 경로 |
| 비파괴적 점검/패치 검증 | 예 (마커 삼중항; 기본적으로 페이로드 없음) | 예 | 아니오 | 예 (block_cannot_read) | 예 (마커 배치) |
| 귀속/User-Agent 태깅 | 예, 모든 명령에 대해 | 아니오 | 아니오 | 전송 플래그 | 아니오 |
| 자동 정리 (웹셸 + 생성된 관리자) | 예 | 예 | 문서화되지 않음 | 토큰 게이트 웹셸만 | 드로퍼 제거됨 [5] |
| 블루팀 탐지 가이드 | 예, 운영 실행 기준 | 아니오 | 아니오 | 대신 실험실 매트릭스 | 완화 노트 |
| 종속성 | stdlib 전용 | stdlib 전용 | 단일 파일 | stdlib 전용, 단일 파일 | Python ≥3.10 패키지 |
[1] 읽기 채널로서 타이밍/블라인드 전용; UNION 가짜-포스트 프리미티브는 브리지 내부에 존재하지만 추출 오라클로 노출되지 않습니다.
[2] 단순 가용성 프로브(0) UNION SELECT …)는 객체 캐시 하이드레이션 중에 조용히 드롭되고, available()이 false를 반환하며, 전체 사전 인증 브리지가 중단됩니다—§1 참조.
[3] 프로젝트 자체 README는 전제 조건 아래 "지속형 객체 캐시 없음(Redis/Memcached)"을 나열합니다.
[4] Sploitus에 미러링된 공개 변형(아래 링크): 블라인드 읽기에 INTO OUTFILE 드로퍼를 RCE 단계로 추가하고, per_page=-1 카테고리 캐리어를 사용합니다.
[5] OUTFILE RCE 경로는 가짜-포스트 렌더링에 의존하지 않으므로 객체 캐시가 이를 차단하지 않습니다—대신 MySQL FILE 권한과 공유 쓰기 가능 디렉터리가 필요합니다. 관리형 호스팅은 거의 항상 WordPress DB 사용자에게 FILE을 부여하지 않으며, secure_file_priv가 일반적으로 설정됩니다.
UNION 가짜-포스트 프리미티브는 WP_Query가 행을 반환하는 방식에 따라 달라집니다:
wp_posts 행을 반환합니다. UNION으로 삽입된 행이 직접 WP_Post가 됩니다. 위조가 렌더링됩니다.지속형 객체 캐시가 있는 호스트에서는 채워진 베이스 결과 집합이 WP_Query를 분할 모드로 밀어넣습니다. 공개 PoC에서 사용하는 표준 프로브:
0) UNION SELECT <forged row> -- -
는 베이스 집합을 채워진 상태로 둡니다(post_author NOT IN (0)이 모든 행과 일치). 따라서 객체 캐시 뒤에서는 위조된 행이 사라집니다: 가용성 프로브가 거짓 음성을 내고, available()이 false를 반환하며, 전체 사전 인증 브리지가 실제로 완전히 익스플로잇 가능한 호스트에서 "죽은" 것으로 보고됩니다. 공개 통합자는 동일한 경계를 "지속형 객체 캐시 없음"을 하드 전제 조건으로 나열하여 문서화합니다.
이 저장소는 대신 베이스 집합을 비웁니다:
1) AND 1=0 UNION ALL SELECT <forged row> -- -
베이스 행이 0개인 경우 위조된 행이 유일한 행입니다. 쿼리는 전체 행 모드를 유지합니다. 하이드레이션 조회가 실행되지 않습니다. 하나의 주입된 키워드(AND 1=0)가 객체 캐시 호스트에서 "UNION 채널 죽음"과 "전체 사전 인증 RCE" 사이의 전체 차이입니다—이들은 관리형 WordPress 운영 환경의 대다수입니다. 진단, 프로브 매트릭스(per_page × 인젝션 형태).
범위 참고: 블라인드/타이밍 읽기 채널은 객체 캐시에 민감하지 않습니다(SQL에서 행을 세는 것은 가짜-포스트 하이드레이션을 포함하지 않음). 따라서 모든 PoC의 블라인드 읽기는 어디서나 동작합니다. 다른 PoC에서 객체 캐시가 죽이는 것은 구체적으로 UNION에 의존하는 부분, 즉 인밴드 추출과 SQLi-to-admin 브리지입니다.
사례 연구에 문서화된 두 번째 관련 교훈: 두 채널이 모두 동작할 때, 인밴드 UNION 읽기를 권위 있는 것으로 취급하십시오—운영 타이밍 오라클은 지터 아래에서 비트 플립을 생성했으며, 인밴드 읽기는 해당 값을 명확히 결정했습니다.
공개 PoC 전체에 걸쳐 세 가지 사전 인증 RCE 경로가 존재합니다:
| 경로 | 사용자 | 추가 전제 조건 |
|---|---|---|
SQLi-to-admin 브리지 (oEmbed/changeset/nav 행 위조 → POST /wp/v2/users → 로그인 → 플러그인 업로드) | 이 저장소, sergiointel (원본), Icex0, 0xsha | 기본 설치 외에 없음 |
INTO OUTFILE 드로퍼 (SQLi를 통해 PHP 파일 작성, 가져와서 셸 획득) | OUTFILE 변형 [4] | MySQL FILE 권한, 이를 허용하는 secure_file_priv, mysqld가 쓰기 가능하고 웹 서버가 제공하는 디렉터리 |
해시 복구 → 크랙 → 로그인 (user_pass 덤프, 오프라인 크랙, 이후 플러그인 업로드) | 모든 (대체 수단) | bcrypt 해시가 실제로 크랙되어야 함 ($wp$2y$, hashcat -m 35500) - 느림, 자주 실패 |
이 저장소는 브리지를 구현합니다: WordPress가 이미 가지고 있는 데이터베이스 권한 이상을 필요로 하지 않으며, DB와 웹 계층이 아무것도 공유하지 않을 때 동작하며, FILE 권한 경로가 의존하는 파일을 남기지 않습니다. 트레이드오프는 복잡성입니다—브리지는 7행의 오염된 포스트 그래프이며, 이는 정확히 §1의 객체 캐시 거짓 음성이 경로를 숨기는 데 사용된 부분입니다.
실험실뿐만 아니라 허가 하에 운영 시스템에 대해 실행되도록 설계되었습니다:
check는 기본적으로 비파괴적 - 수동 핑거프린트에 무해한 마커 배치; --confirm-sqli가 주어지지 않으면 SQL 페이로드가 전송되지 않습니다. 패치 후, 사라지는 마커 삼중항은 수정 검증으로도 사용됩니다.--user-agent가 있어 모든 익스플로잇 트래픽이 로그에서 식별 가능합니다(공개 도구가 기본값으로 설정하지 않는 참여 규칙).author_exclude → author__not_in 싱크, 가짜 WP_Post UNION 프리미티브, 커스터마이저 브리지 개념은 모두 공개된 기술입니다(계보는 아래에 명시됨).INTO OUTFILE 드로퍼), Sploitus에 미러링됨
https://sploitus.com/exploit?id=7CD079AD-E27B-5C54-A696-60635BFDB241