Dimostrazione dell'iniezione SQL

4

Voglio fare una demo per una pagina di accesso che è vulnerabile all'iniezione SQL per scopi di formazione. Ho già provato a crearne uno usando PHP e MySQL. Ho commentato il risanamento del codice per rendere la pagina vulnerabile.

Il codice della pagina di accesso è questo:

//step 1a: sanitise and store data into vars (storing encrypted password)
//$usr = mysqli_real_escape_string($dbc, htmlentities($_POST['u_name']));
//$psw = SHA1($_POST['u_pass']) ; //using SHA1() to encrypt passwords  
$usr = $_POST['u_name'];
$psw = $_POST['u_pass'] ; 

//step2: create query to check if username and password match
$q = "SELECT * FROM users WHERE userName='$usr' AND password='$psw'  ";

//step3: run the query and store result
$res = mysqli_query($dbc, $q);

Quindi, ho cercato di inserirlo nei campi nome utente e password: ' or '1' = '1

Tuttavia, la pagina web mi dice che il nome utente e la password sono sbagliati. Come posso far funzionare SQL injection?

    
posta user2192774 26.02.2015 - 19:43
fonte

3 risposte

2

Se stai iniettando entrambi i campi allo stesso tempo:

Pensa alla stringa SQL con il testo sostituito:

"SELECT * FROM users WHERE userName='$usr' AND password='$psw' "

diventa

"SELECT * FROM users WHERE userName='' OR '1' = '1' AND password='' OR '1' = '1' "

È possibile eseguire quella query da un prompt SQL e ottenere una risposta? Penso che potresti scoprire che il flusso logico con tutti questi AND e OR ti farà inciampare.

    
risposta data 26.02.2015 - 20:06
fonte
1

Come altri hanno commentato, è necessario prestare attenzione all'istruzione SQL risultante. Con uno SQLi in genere si richiede / si desidera solo l'iniezione su un campo uno . Come notato da @schroeder, l'input di esempio finisce essenzialmente con

SELECT * FROM users WHERE userName='' OR '1' = '1' AND password='' OR '1' = '1'

inviato al server SQL. Le dichiarazioni AND e OR sono difficili da raggiungere in un punto in cui risultano in una vera affermazione. Questo sarebbe particolarmente difficile se non si avesse accesso al codice sorgente.

Il trucco tipico di SQLi è quello di provocare la fine dell'istruzione SQL e commentare il resto della query che verrà creata dal codice. Quindi, se inserisci

' or 1=1;--  

per il nome utente e qualsiasi cosa desideri per la password, l'istruzione SQL che viene creata è:

SELECT * FROM users WHERE userName='' OR 1=1;-- ' AND password='whatever'

* Modifica: @gumbo ha sottolineato che MySQL richiede uno spazio dopo il -, che ora è stato aggiunto. Rimozione del; potrebbe essere richiesto. Parte del divertimento dell'iniezione SQL riguarda il modo in cui ogni motore interpreta SQL!

Questo ti permette di evitare di dovermi preoccupare di come il resto dell'istruzione sia costruito perché il resto non viene eseguito . Qui il database non vedrà / eseguirà la parte di confronto delle password perché fa ora parte di un commento. Nel caso in cui non si riesca a vedere il codice sorgente, provarlo prima sul nome utente e poi sulla password poiché non si sa quale parametro verrebbe per primo nell'istruzione SQL.

    
risposta data 26.02.2015 - 21:52
fonte
0

Se usi

userName: ' OR 1=1 -- .
password: whatever

Questa query

SELECT * FROM users WHERE userName='' OR 1=1 -- .' AND password='whatever'
  • ' chiude la stringa
  • OR 1=1 ignora che userName='' non corrisponde a nulla
  • Con -- . si crea un commento in modo che non importi ciò che viene dopo.
  • Il . è nel caso in cui lo utilizzi non in un modulo ma in un URL perché alcuni browser taglieranno lo spazio.

La query sarà fondamentalmente questa:

SELECT * FROM users WHERE 1=1

Si noti che questo restituirà tutti gli utenti. A seconda del codice che segue, potrebbe essere necessario restituire esattamente un utente. Per questo potresti limitare i risultati:

userName: ' OR 1=1 LIMIT 1 -- .

Oppure indovina il nome utente:

userName: admin' OR 1=1 -- .

Ultimo ma non meno importante dai un'occhiata a Iniziare con lo sviluppo di sandbox

    
risposta data 06.03.2015 - 09:28
fonte

Leggi altre domande sui tag