Bypassing login con SQL Injection

2

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?

    
posta ticket 31.03.2016 - 16:03
fonte

1 risposta

6

Prova ad aggiungere un UNION SELECT alla query SQL.

Un union-select consente all'hacker di aggiungere un'istruzione select completamente nuova. I risultati di questa seconda selezione sono aggiunti a quelli del primo. Quando la prima richiesta non restituisce alcun risultato, la selezione unione consente all'autore dell'attacco di avere il controllo completo sul set di risultati. Ricorda che un'istruzione select non ha nemmeno bisogno di menzionare una tabella e può invece restituire dei letterali. SELECT * FROM accounts WHERE username = '' UNION SELECT 'admin', 'TotalyTheAdminsPassword', 'dummy', 'dummy', 'dummy', 'dummy' è completamente valido.

Un UNION SELECT significa che l'attacker deve calcolare il numero di colonne richieste (il secondo SELECT deve corrispondere al conteggio delle colonne del primo SELECT, o il database genererà un errore) e quale colonna rappresenta quale campo, ma un aggressore può solitamente capirlo attraverso la sperimentazione.

    
risposta data 31.03.2016 - 16:26
fonte

Leggi altre domande sui tag