PHP: quanti tutorial contengono vulnerabilità?
Lo sviluppatore tedesco Philip Waritschlager, creatore dell’open data browser Produpedia, ha effettuato una breve ricerca riguardo ai risultati di Google collegati a tutorial PHP in cui sono presenti delle vulnerabilità in grado di favorire i tentativi di SQL injection. Durante il test, una volta lanciata la query “php mysql email register” il motore di ricerca avrebbe restituito una serie di articoli, how-to e porzioni di codice permettendo di registrare ben 16 risultati su 30 contenenti istruzioni SQL potenzialmente rischiose.
Per ottenere una selezione quanto più precisa possibile Waritschlager ha omesso tutti i contenuti non correlati con l’argomento della query e le risorse dietro paywall, sono stati invece inclusi tutti i risultati in cui sono stati pubblicati snippet come il seguente:
mysqli_query("SELECT * FROM user WHERE id = '" . $_POST["user'] . "'");
dove il passaggio di una variabile di metodo (POST nell’esempio) come argomento dell’istruzione, e nello specifico della clausola WHERE, potrebbe esporre al passaggio arbitrario di parametri in query.
Classificazione del codice vulnerabile
Le pagine Web contenute nella SERP prodotta dalla ricerca sono state suddivise in base al livello di rischio derivante dall’errore rilevato. Abbiamo quindi:
- query SQL in cui si è proceduto correttamente all’escape dei parametri;
- parametri sottoposti ad escape solo quando (ritenuto) strettamente necessario;
- query contenenti vulnerabilità nonostante il tentativo di operare l’escape;
- assenza totale di escape dei parametri.
Apparterrebbero alla prima categoria 12 pagine Web, mentre soltanto 2 farebbero riferimento alla seconda.
Più interessante il dato relativo al terzo e quarto gruppo con ben 9 risultati ascrivibili a quest’ultimo e 2 risorse trovate in video di YouTube sulle 7 classificabili nella categoria precedente.
Come operare la selezione dei risultati
In quasi tutti i casi rilevati le vulnerabilità riguarderebbero la mancata sanitizzazione delle variabili in una condizione del comando SELECT, cosa che avverrebbe per esempio nella selezione di utenti dalla relativa tabella:
"SELECT * FROM users WHERE email='$email' LIMIT 1";
o in istruzioni per l’aggiornamento dei record:
$query = "update users set status='1' where token='$token'";
Le ragioni di questo fenomeno sono da ricercarsi in particolare nella mancanza di un processo di revisione, soprattutto quando si parla di contenuti autoprodotti, così come nel fatto che su Internet sono presenti numerosi contenuti obsoleti. Chiaramente devono essere ormai esclusi dalla consultazione tutti i tutorial più datati (compresi quelli dell’autore di questo post) in cui si fa ancora ricorso alle mysql functions e, nello stesso modo, quelli basati sulle estensioni MySQLi e PDO in cui non vengono utilizzati i prepared statements quando necessari.
Fonte: html.it