SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

WordPress 미인증 원격 코드 실행 (CVE-2026-63030)

EQST Now | 2026.07.20

NOW Briefing

Brief 1 워드프레스(WordPress) 코어에서 서로 다른 두 취약점을 엮어 로그인 없이 서버 명령을 실행할 수 있는 미인증 RCE(원격 코드 실행) 공격 체인이 공개됐습니다. 연구자들이 wp2shell이라 명명한 이 체인은 REST API 배치 처리 오류(CVE-2026-63030)와 WP_Query의 SQL 인젝션(CVE-2026-60137)을 연쇄합니다.
Brief 2 별도 플러그인이나 사용자 조작 없이 기본 설치 상태의 사이트에서도 성립하며, 공격자는 새 관리자 계정을 만들고 웹셸을 올려 www-data 권한으로 명령을 실행할 수 있습니다.
Brief 3 영향 버전(6.9.x·7.0.x)은 6.9.5 또는 7.0.2로 즉시 업데이트해야 합니다. 아직 패치하지 못했다면 WAF에서 /wp-json/batch/v1 배치 경로를 차단해 노출을 줄여야 합니다.

WordPress 미인증 원격 코드 실행 (CVE-2026-63030)

■ 개요

WordPress는 전 세계 5억 개 이상의 웹사이트가 사용하는 세계 최대 CMS(콘텐츠 관리 시스템)로, 국내 기업·기관 홈페이지에도 광범위하게 도입돼 있습니다. 이번 wp2shell 체인은 플러그인이 아니라 워드프레스 코어 자체의 취약점이며, REST API가 기본 활성화된 표준 설치 환경을 대상으로 합니다. 영향 범위는 코어 6.9.0~6.9.4 및 7.0.0~7.0.1이고, SQL 인젝션 취약점 하나는 6.8.0~6.8.5까지 거슬러 올라갑니다.

무엇보다 인증이 전혀 필요 없습니다. 공격자는 계정 없이 REST API 배치 엔드포인트(여러 API 요청을 한 번에 묶어 처리하는 경로)의 처리 오류를 이용해 SQL 인젝션 페이로드를 내부까지 밀어 넣습니다. 이어서 관리자 컨텍스트를 탈취하고, 새 관리자 계정을 생성한 뒤 플러그인 형태의 웹셸을 올려 원격 코드 실행에 도달합니다. 공개 PoC 기준으로 최종 명령은 웹서버 계정(uid=33(www-data)) 권한으로 실행됩니다.

이러한 공격 흐름이 공개된 뒤, 이미 공개 익스플로잇과 실제 공격 악용 정황이 확인됐습니다. 취약점은 Searchlight Cyber의 Adam Kues가 발견했고, 벤더는 2026년 7월 17일 6.9.5·7.0.2 패치를 배포하며 GitHub Security Advisory로 공개했습니다. 이후 하루 만에 다수의 공개 PoC가 등장했고, 보안 업체 watchTowr는 실제 환경에서의 초기 악용 징후를 관측했다고 밝혔습니다. 워드프레스는 영향 버전에 대해 강제 자동 업데이트를 활성화한 상태입니다.

■ 요약

항목 내용
CVE ID • CVE-2026-63030 (REST API 배치 라우트 혼동)
• CVE-2026-60137 (WP_Query SQL 인젝션)
CVSS 점수 • CVE-2026-63030: CVSS 7.5
• CVE-2026-60137: CVSS 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N, 단독 악용 시 별도 플러그인 필요)
취약점 유형 • REST API 배치 처리 시 핸들러 배열 정렬 오류(라우트 혼동)
• CWE-89, author__not_in 미검증 SQL 인젝션
영향/위험 • 미인증 원격 코드 실행 가능
• 관리자 계정 무단 생성 및 웹셸 업로드
• DB 내 사용자·자격증명 등 정보 유출
• 기본 설치 환경에서 성립(지속형 객체 캐시 미사용 조건)
취약 버전 • 체인(RCE): 6.9.0~6.9.4, 7.0.0~7.0.1
• SQL 인젝션 단독: 6.8.0~6.8.5
패치 버전 • 6.9.5
• 7.0.2
• 6.8.6 (SQL 인젝션만 수정)

■ 기술 분석

체인의 진입점은 CVE-2026-63030입니다. REST API 배치 엔드포인트는 여러 하위 요청을 순차 처리하면서 각 요청의 핸들러를 배열에 쌓습니다. 그런데 잘못된 경로를 담은 요청이 WP_Error로 거부되면 해당 핸들러가 배열에 추가되지 않아 정렬이 어긋납니다. 뒤따르는 호출은 자기 파라미터를 그대로 든 채 다른 요청의 핸들러로 실행됩니다. 공격자는 이 어긋남을 이용해 스키마 검증을 통과한 정상 파라미터를, 검증이 느슨한 다른 핸들러 쪽으로 흘려보냅니다.

이렇게 밀려 들어온 값이 두 번째 취약점 CVE-2026-60137을 건드립니다. WP_Query는 워드프레스가 게시물을 조회할 때 쓰는 핵심 쿼리 클래스입니다. 이 클래스는 작성자 제외 조건인 author__not_in 값을 정수로 정제하는데, 이 정규화는 값이 배열일 때만 동작합니다. 값이 문자열로 들어오면 is_array() 검사를 통과하지 못해 정제가 통째로 생략되고, 문자열이 그대로 SQL의 NOT IN() 절에 삽입됩니다.

이 취약 지점을 막기 위해 패치는 타입 검사에 의존하던 로직을 제거하고, 입력 형태와 무관하게 정수 목록으로 강제하는 wp_parse_id_list()를 거치도록 바꿨습니다. 삽입 지점도 sprintf()로 감싸 안전하게 구성합니다.

/* [패치 전] class-wp-query.php */
if ( is_array( $query_vars['author__not_in'] ) ) {
    $query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
    sort( $query_vars['author__not_in'] );
}
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
$where         .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";

/* [패치 후] */
$author__not_in_id_list = wp_parse_id_list( $query_vars['author__not_in'] );
if ( count( $author__not_in_id_list ) > 0 ) {
    sort( $author__not_in_id_list );
    $where .= sprintf(
        " AND {$wpdb->posts}.post_author NOT IN (%s) ",
        implode( ',', $author__not_in_id_list )
    );
}

📘 INFO

SQL 인젝션(CVE-2026-60137) 자체는 6.8.x부터 존재했지만, 미인증 RCE로 끌어올리는 배치 라우트 혼동(CVE-2026-63030)은 6.9에서 도입됐습니다.
따라서 6.8.x는 SQL 인젝션 단독 위험(플러그인이 값을 전달하는 경우)에 그치고, 완전한 체인은 6.9.0~7.0.1에서 성립합니다.

■ PoC

앞의 두 취약점이 결합되는 방식은 공개 PoC(0xsha wp2shell.py)에서 배치 요청의 라우트 혼동으로 검증을 우회한 뒤, author__not_in을 배열이 아닌 문자열 페이로드로 전달하는 흐름으로 확인됩니다. 아래는 미검증 지점이 무너지는 과정을 방어용으로 단순화한 예시입니다. 스키마 우회와 관리자 탈취에 필요한 요청 조립 절차는 의도적으로 생략했습니다.

# 방어용으로 단순화한 예시 — 실제 익스플로잇 아님

# 정상 사용: 배열 → is_array() 통과 → absint 정제 적용
author_not_in = [3, 7]

# 악용 관점: 문자열로 전달되면 정제가 생략되고 NOT IN() 절에 그대로 삽입
author_not_in = "0) AND <boolean_condition>-- -"   # 실제 페이로드/스키마 우회 로직은 생략

# ... 배치 라우트 혼동을 통한 스키마 우회·관리자 탈취 단계 생략 ...

⚠️ WARN

이 코드는 실제 익스플로잇이 아니라 공개 PoC의 검증 관점을 방어적으로 단순화한 예시입니다.
공개된 완전한 PoC와 실제 공격 악용 정황이 이미 확인된 상태이므로, 영향 버전을 운영 중이라면 이미 노출된 것으로 간주하고 대응해야 합니다.

■ 탐지 및 점검

• 우선 워드프레스 관리 화면 또는 CLI(wp core version)로 코어 버전을 확인하고, 6.9.0~7.0.1 구간이면 즉시 패치 대상으로 분류합니다.

• 웹서버 접근 로그에서 /wp-json/batch/v1 경로로 향하는 익명 POST 요청의 급증 여부를 점검합니다.

• 사용자 목록에서 관리자(administrator) 권한 계정이 최근 무단으로 생성되지 않았는지 전수 확인합니다.

wp-content/plugins 및 업로드 디렉터리에서 최근 생성된 미확인 PHP 파일(웹셸 의심 산출물)을 검사합니다.

• REST API 응답에서 SQL 오류나 비정상 게시물 데이터가 반환된 흔적이 있는지 애플리케이션 로그를 점검합니다.

✅ CHECK

패치 이전에 이미 악용됐을 가능성이 있습니다.
관리자 계정 감사와 웹셸 스캔은 버전 업데이트와 별개로 반드시 병행해야 합니다.

■ 대응 방안

• 점검 결과 영향 버전(6.9.x·7.0.x)에 해당하면 6.9.5 또는 7.0.2로 즉시 업데이트하고, 자동 업데이트가 비활성화된 사이트는 수동으로 적용합니다.

• SQL 인젝션 단독 위험이 있는 6.8.x는 6.8.6으로 업데이트합니다.

• 즉시 패치가 어려우면 WAF나 웹서버 규칙으로 /wp-json/batch/v1 경로 및 익명 REST API 접근을 차단합니다.

• 침해가 의심되면 관리자 비밀번호와 보안 키(wp-config.php의 salt)를 폐기·재발급하고, 무단 생성 계정과 웹셸을 제거합니다.

💡 TIP

지속형 객체 캐시(Redis·Memcached 등 외부 캐시)를 사용하는 환경에서는 체인 성립 조건이 달라지지만, 우회 대책으로 신뢰하지 마십시오.
근본 대응은 패치이며, 캐시 구성은 보조 완화 조치로만 취급해야 합니다.

[참고 자료]

Rapid7 — CVE-2026-63030: wp2shell, a Critical RCE in WordPress Core

GitHub Security Advisory — GHSA-fpp7-x2x2-2mjf (CVE-2026-60137)

WordPress/wordpress-develop commit 74d37a3 — Force author__not_in values to be integers

BleepingComputer — WordPress Core "wp2shell" RCE flaws get public exploits, patch now

0xsha/wp2shell — PoC 저장소

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.