cPanel-host SSRF via userinfo-injection (evil.com@127.0.0.1) #126

Closed
opened 2026-05-26 18:23:55 +00:00 by jesse-a · 1 comment
Owner

Severity: HIGH

normalizeHost() in src/app/actions/wordpress-cpanel.ts deed string-replaces op de raw input om protocol/path/port te strippen, daarna rejectInternalTarget() op de overgebleven string. Een input als evil.com@127.0.0.1 passeerde alle checks (geen IP-literal, geen localhost, geen interne TLD).

Maar cpanelUapi() deed daarna new URL(https://${auth.host}:${auth.port}/...) — de URL-spec parseert evil.com@127.0.0.1:2083 als userinfo=evil.com + hostname=127.0.0.1. Eindresultaat: outbound fetch naar loopback met cPanel-API-token in de Authorization-header.

Fix: nieuwe safeHostnameFromInput() in src/lib/url-security.ts. Parseert de input via new URL(), weigert URLs met userinfo (u.username || u.password), en retourneert puur u.hostname — de échte target zoals fetch 'm zou interpreteren. normalizeHost() leunt nu hierop.

Files: src/lib/url-security.ts, src/app/actions/wordpress-cpanel.ts

**Severity: HIGH** `normalizeHost()` in `src/app/actions/wordpress-cpanel.ts` deed string-replaces op de raw input om protocol/path/port te strippen, daarna `rejectInternalTarget()` op de overgebleven string. Een input als `evil.com@127.0.0.1` passeerde alle checks (geen IP-literal, geen localhost, geen interne TLD). Maar `cpanelUapi()` deed daarna `new URL(`https://${auth.host}:${auth.port}/...`)` — de URL-spec parseert `evil.com@127.0.0.1:2083` als `userinfo=evil.com` + `hostname=127.0.0.1`. Eindresultaat: outbound fetch naar loopback met cPanel-API-token in de Authorization-header. **Fix**: nieuwe `safeHostnameFromInput()` in `src/lib/url-security.ts`. Parseert de input via `new URL()`, weigert URLs met userinfo (`u.username || u.password`), en retourneert puur `u.hostname` — de échte target zoals fetch 'm zou interpreteren. `normalizeHost()` leunt nu hierop. **Files**: src/lib/url-security.ts, src/app/actions/wordpress-cpanel.ts
Author
Owner

Opgelost in commit de87b11.

Opgelost in commit de87b11.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jesse-a/OpenCRM#126
No description provided.