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(...)
liefert0
bei Gleichheit,aber auch
false
oderNULL
bei unerwarteten Datentypen,und in PHP gilt:
NULL == 0
bzw.false == 0
→true
(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:
erkennt PHP, dass ein String mit einem Array verglichen werden soll
dies ist nicht zulässig →
strcmp()
gibtfalse
zurückfalse == 0
ergibttrue
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 Arraystrcmp("admin", array)
→ ergibtfalse
false == 0
→true
→ 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ückgabenTypprü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