Poweradmin v4.3.2 uses the attacker-controlled HTTP_HOST request header as the
authoritative source for building callback URLs in its OIDC, SAML, and logout
authentication flows without any validation. An unauthenticated attacker can poison
the redirect_uri sent to the Identity Provider, causing the IdP to redirect the
victim's authorization code to an attacker-controlled server - resulting in full
account takeover with no credentials required.
Three independent code paths are affected:
OidcService::getCallbackUrl() - redirect_uri poisoningSamlConfigurationService::getBaseUrl() - SAML ACS/SLO URL poisoningLogoutController::getBaseUrl() - post-logout redirect poisoningRoot Cause
The application constructs absolute URLs dynamically from HTTP_HOST rather than
from a trusted configured base URL. The header is fully client-controlled and is not
validated before use in any authentication flow.
Poweradmin's own codebase contains the correct pattern -
DocsController::getValidatedHost() (line 244) calls isValidHostname() before
using the value - but this was never applied to authentication flows.
lib/Application/Service/OidcService.php (~line 460)private function getCallbackUrl(): string
{
$scheme = $this->detectScheme();
// HTTP_HOST taken directly with zero validation
$host = $this->request->getServerParam('HTTP_HOST', 'localhost');
$basePrefix = $this->configManager->get('interface', 'base_url_prefix', '');
return $scheme . '://' . $host . $basePrefix . '/oidc/callback';
}
HTTP_HOST is embedded verbatim as redirect_uri in the OAuth 2.0 authorization
request sent to the IdP. HTTP_X_FORWARDED_PROTO is similarly used unvalidated
for scheme detection.
Secondary: lib/Application/Service/SamlConfigurationService.php (~line 134)
private...
4.2.44.3.3Exploitability
AV:NAC:LPR:NUI:RScope
S:CImpact
C:HI:HA:L9.6/CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:LInput Validation