Come rivedere un modulo di accesso SQL Injection vulnerabile in PHP
Riepilogo
Abbiamo esaminato un modulo di accesso scritto in php e vulnerabile a SQL Injection. Abbiamo confrontato diverse versioni del codice e creato un payload SQL Injection per ciascun caso.
Ottieni le note sul certificato OSCP
Primo esame del codice
Il codice è un codice php per il modulo di accesso. Come possiamo vedere, il nome utente e la password di accesso sono memorizzati in due variabili. Il valore di ciascuna variabile viene preso come input dall'utente tramite richiesta HTTP POST.
Il problema qui è che qualunque cosa l'utente inserisca nel modulo di accesso, viene utilizzata direttamente nella query SQL nella riga seguente e quindi eseguita nel backend consentendo il verificarsi di input dannosi.
Sfruttamento
Lo screenshot seguente illustra come abbiamo inserito un payload SQL nel modulo di accesso
Possiamo provare diverse varianti di carico utile come
root' o 1=1##
' oppure 1=1 — #
' o 1–
Finché le variabili dei campi di accesso non vengono utilizzate con virgolette singole. Vedremo esempi di codice in cui le variabili sono citate. In questi casi, il payload dell’SQL injection sarebbe diverso.
Lo screenshot seguente mostra lo sfruttamento riuscito del modulo di accesso.
Secondo esame del codice
Nello screenshot seguente, abbiamo esaminato un altro modulo di accesso php vulnerabile a SQL Injection. La differenza è che le variabili di login vengono utilizzate tra virgolette singole nella variabile di query
Pertanto il nostro payload SQL sarebbe diverso. Il nostro payload in questo caso dovrebbe iniziare e terminare con una virgoletta per chiudere quelle utilizzate nella variabile di query.
L'esempio potrebbe essere:
‘ o "='
'radice o ”='
Terzo esame del codice
Abbiamo modificato lo stesso codice per utilizzare parentesi con virgolette singole nella query SQL.
In questo caso, anche il nostro payload SQL dovrebbe iniziare con una virgoletta singola e una parentesi
') o vero–
Esame del Quarto Codice
Cosa succederebbe se il codice contenesse le due variabili di login con parentesi e virgolette doppie?
I nostri payload SQL in questo caso devono chiudere le parentesi e le virgolette doppie
"o vero–
“) o vero–
')) o vero–
Video tutorial completo