Si tratta di un'iniezione SQL funzionante. Come potrebbe apparire la stringa di query lato server?

4

Questa domanda riguarda un piccolo dettaglio in un compito scolastico più ampio. Ho lottato con questo piccolo problema per troppo tempo.

ABCTF ha organizzato una competizione Capture-the-Flag che si è tenuta all'inizio di quest'anno. Uno dei problemi in questa competizione è stata un'iniezione SQL. Questo è un URL per la descrizione dell'attività e questo è un URL per il modulo di accesso che doveva essere iniettato. Esiste una soluzione pubblicata per questo problema e appare come segue:

Nome utente: -1 'union select 1,1,1,1 #

Password: 1

Ho bisogno di capire come potrebbe apparire la stringa della query di back-end. L'ipotesi più semplice e più ingenua sarebbe

String query = "SELECT FROM user WHERE username = '" + inputA + "' AND password = '" + inputB + "';";
execute(query);

Ma questo produrrebbe

String query = "SELECT FROM users WHERE username = '-1' union select 1,1,1,1 #' AND password = '1';";
execute(query);

Il problema più evidente di questo è che le virgolette sono sbilanciate. Inoltre, non capisco quale output produrrebbe l'istruzione SELECT. Come ho capito, il carattere "#" è usato per indicare tabelle temporanee in MS SQL Server, come "#temporary_table". Ho anche suonato con altre semplici affermazioni, ma nulla avrebbe avuto senso.

Qualcuno ha un'idea di come potrebbe sembrare la query di backend ? Qualsiasi suggerimento è apprezzato.

    
posta Magnus 02.11.2016 - 18:47
fonte

2 risposte

2

Il link afferma che la soluzione implica l'aggiunta di una nuova linea falsa tramite unione in cui ogni valore è un 1. Il -1 come nome utente cerca di assicurarsi che la query non restituisca dati validi come lingue lato server di solito solo confrontare la prima riga. Un esempio potrebbe essere il seguente codice.

password = execute("SELECT password FROM users WHERE username = '{$username}'");
if( password != $password ) fail();
pass();

Quale risulta

password = execute("SELECT password FROM users WHERE username = '-1' union select 1,1,1,1 #'");
// no username called -1 means that the only row returned is the artificial row, so password = 1
if( password != 1 ) fail();
pass();

Ricorda che ci sono milioni di modi in cui questo codice potrebbe funzionare, che vanno dal solo SQL alle vulnerabilità nell'applicazione web. Tuttavia, ho trovato questo approccio più realistico.

    
risposta data 02.11.2016 - 21:23
fonte
7

In MySQL, il simbolo # può essere utilizzato come marcatore di commenti. Le virgolette nei commenti non devono essere bilanciate.

Non tutte le istanze SQL sono eseguite su database Microsoft.

    
risposta data 02.11.2016 - 19:37
fonte

Leggi altre domande sui tag