Sto imparando su SQL Injection e sto giocando sulla mia macchina locale con un'applicazione web vulnerabile, che ha un modulo di accesso.
Come funziona il meccanismo di accesso è che per prima cosa cerca se esiste un utente con il nome utente digitato nel database, se esiste, restituisce i dati dell'utente dal database e poi controlla se ciò che è digitato nella password il campo è uguale alla password utente effettiva restituita dal database. Si prega di notare che non è richiesto l'hashing della password.
L'applicazione utilizza una query come quella seguente per recuperare i dati dell'utente dal database: "SELECT * FROM accounts WHERE username = '" + username + "'"
. Ho già usato qualcosa del genere per il campo username nel formato: test' OR 1=1 LIMIT 1--
, e questo effettivamente restituisce nell'applicazione i dati del primo utente dal database (l'ho controllato in modalità debug). Ma il login fallisce ancora, perché come ho detto il valore della password che ho inserito, e la password dell'utente reale non corrisponde, semplicemente, quando arriva a questa linea di codice, fallisce:
if (enteredPasswordField.Equals(usersPassword, StringComparison.Ordinal)) return SUCCESS;
else return FAILURE;
E come si può vedere la password dell'utente non è coinvolta nella query SQL. Stavo pensando di iniziare una nuova istruzione SQL nel campo del nome utente per cambiare la password degli utenti, ma in qualche modo mina lo scopo. Qualche idea come posso bypassare questo?