Iniezione SQL con istruzione "INSERT"

1

Attualmente sto studiando le iniezioni SQL più basilari che sono possibili. Puro e unicamente allo scopo di insegnarmi le basi prima di passare a quelle più avanzate. Sto ricreando questa situazione con la seguente affermazione:

$result = $dbConnect->query("INSERT INTO UserTable VALUES (NULL,'$name','$email', '$userName', '1')");

Ho alcune domande riguardo questa affermazione (so che questa è una cattiva pratica, ma voglio iniziare come base possibile).

  1. È possibile iniettare qualcosa in questo anche se è in una dichiarazione if?
  2. Come puoi evitare questa query?
  3. C'è la possibilità di echeggiare l'intera istruzione in modo da ottenere più informazioni nel php utilizzato, il che significa che l'intera query dei risultati viene echeggiata a causa del codice inserito?
  4. Se questo ha una potenziale situazione di iniezione SQL. Ci sono persone abbastanza stupide da codificare in questo modo?

Grazie in anticipo!

    
posta Kipt Scriddy 20.10.2013 - 19:27
fonte

4 risposte

3

Is it possible to inject something into this even if it's in an if statement?

Sì. Con query multilinea, un semplice '; drop table usertable;-- funziona. Con le query a riga singola, ' (select abc from def),0)-- può funzionare, sebbene con un po 'più di nidificazione puoi eseguire praticamente qualsiasi cosa.

How can you escape out of this query?

Semplicemente sfuggire a qualsiasi cosa non funzionerà, poiché questo potrebbe cambiare il significato di alcuni dei personaggi. Devi stare attento.

Cose come mysqli_real_escape_string() sono anche vulnerabili. Utilizza le istruzioni preparate.

Is there a possibility to echo the whole statement so you could get more intel in the php used, meaning that the whole result query is being echo'ed due to the injected code?

Certo, memorizza prima la stringa e poi echo. Ma potrebbe essere peggio, è meglio se l'attaccante non può vedere nulla. È preferibile registrare le query.

If this has a potential SQL injection situation. Are there any people dumb enough to code this way?

Non è tanto stupido quanto ignoranza / disattenzione, ma sì. L'iniezione di MySQL è una delle più comuni vulnerabilità del web in circolazione.

    
risposta data 21.10.2013 - 08:50
fonte
2

1) La query SQL viene semplicemente racchiusa in un'istruzione if di PHP non avrà alcun impatto sulla possibilità o meno che un utente malintenzionato inserisca nell'istruzione.

2) Chi può scappare da esso? Tu o l'attaccante? Supponendo che tu intenda l'attaccante e dato l'esempio che fornisci, nessuno può. I valori che hai usato per la query sono hard coded. Perché ci sia una vulnerabilità di SQL injection è necessario utilizzare l'input utente . Ad esempio, il campo di input email per la query potrebbe essere utilizzato per alimentare qualcosa di diverso da [email protected] nell'istruzione.

3) Se vuoi dire che è possibile che l'attaccante abbia quell'output nel loro browser, allora forse. Dipende dal livello di sanificazione dell'input e dal livello di output dell'errore. Se un utente malintenzionato invia un input non valido alla query per causare un errore di sintassi e l'output dell'errore è abbastanza dettagliato, allora sì, è possibile. Tra le altre opzioni comunque.

4) Ci sono sempre persone abbastanza stupide da codificare in questo modo. Il 99,9% delle esercitazioni che ho visto su Internet documentano come utilizzare l'interfaccia mysql per gli utenti che ora sono stati deprecati. In secondo luogo, la maggior parte di loro non parla nemmeno di sicurezza e semplicemente mostra come ottenere un blocco di codice funzionante con il minimo sforzo.

    
risposta data 20.10.2013 - 20:20
fonte
1

La prima cosa, dovresti controllare qui - è il supporto per più istruzioni in una singola query. Puoi lasciare INSERT statement e provare ad eseguire un'altra query SQL: $userName = x', 1); DROP TABLE userTable;#


Tuttavia, supponiamo, che più istruzioni siano disabilitate (ad esempio, il vecchio mysql_query non supporta di default). La seconda idea per verificare il codice PHP sarebbe - utilizzando sottoquery. Invece di inserire alcune stringhe costanti (come $ name, $ email, $ username, ecc.), Potremmo provare ad inserire il valore della sottoquery:

$email = x',(SELECT 'aaa' FROM DUAL),1)# .

Questo carico utile comporterebbe una query: INSERT INTO UserTable VALUES (NULL,'$name','x',(SELECT 'aaa' FROM DUAL),1)#', '$userName', '1')

Così come vedi, nella colonna userName (da UserTable) vedrai il risultato di SELECT sottoquery. Se il valore di userName viene visualizzato sul sito web della vittima (che suppongo sia), l'utente malintenzionato potrebbe controllare il risultato della sottoquery inserita.

Inoltre, se l'attaccante vuole essere più inosservato (la creazione di molte voci nel database potrebbe essere facilmente notato) - potrebbe usare ciechi-sqli o tecniche basate sugli errori nelle subquery inserite (puoi trovare maggiori dettagli qui ).

    
risposta data 21.10.2013 - 01:05
fonte
0

Il punto è che, utilizzando i valori che includevano virgolette singole nei campi delle variabili, gli autori di attacchi potrebbero tentare di fare ogni sorta di cose cattive sul tuo database, nessuna delle quali sarebbe ciò che intendevi accadere. Probabilmente genererebbe solo molti errori imprevisti; ma qualunque cosa abbia fatto, non sarebbe a vostro vantaggio.

    
risposta data 21.10.2013 - 05:45
fonte

Leggi altre domande sui tag