Sostituisce tutti gli apostrofi con due apostrofi sufficienti a impedire l'SQL-injection su MSSQL?

3

Sto lavorando in un sito Web che non utilizza parametri su query SQL. Tutte le query sono ad hoc e il modo in cui stanno facendo la validazione dell'input mi sembra soddisfacente, non sono in grado di romperle per fare SQL Injection.

Convalidano l'input numerico e se si tratta di una stringa, stanno facendo questo (ad esempio:

sanitizedInput = "'" & Replace(input, "'", "''") & "'"

In altri SGBD è facile da rompere, ma in MSSQL non sto trovando un modo per farlo. Come posso rompere questo? Voglio solo mostrare loro che questo non è abbastanza.

    
posta Bruno Costa 28.09.2011 - 12:20
fonte

4 risposte

5

No. Questo certamente non gestirà la concatenazione di stringhe che non è delimitata da virgolette. per esempio. un campo numerico.

Si consideri

sql= "select username from users where id=" + id

se id è fornito come 1 or 1=1 , è possibile restituire tutte le righe dal database. Ovviamente questo esempio può essere esteso a union select attacchi o anche a intere query annidate.

Usa solo i parametri associati ed evita l'intero problema di SQLi.

    
risposta data 28.09.2011 - 15:02
fonte
4

I'm not able to break it

Solo perché tu non sei in grado di romperlo, non garantisce che nessun altro possa infrangerlo. Ho visto attacchi SQL injection riportati nel diario SANS che non riesco nemmeno a capire (soprattutto perché non ho il tempo di capire cosa stanno facendo).

link
link
link

    
risposta data 29.09.2011 - 02:07
fonte
4

Se si desidera una sicurezza garantita dagli attacchi per iniezione, utilizzare i parametri associati.

In pratica, il tuo metodo potrebbe essere sicuro per un particolare RDBMS, ma non ne hai la garanzia - tutto ciò che puoi fare è confrontarti con i tipi di attacchi al codice che puoi pensare di controllare (mentre i parametri associati semplicemente non consentire l'iniezione di codice).

Sei sicuro che MSSQL non mappa alcun carattere da set di caratteri alternativi (ad es. unicode) a una virgoletta singola (o un carattere di escape come \), che renderebbe possibile un attacco di iniezione contro la tua difesa? Sei sicuro che l'elaborazione successiva del tuo input igienizzato non inavvertitamente (o intenzionalmente da un co-amministratore malevolo) interrompa la tua procedura di igiene? Sei sicuro che un aggiornamento a MSSQL non includerà in seguito un nuovo supporto per lingua / set di caratteri che consentirebbe a qualcuno di eseguire questo attacco in stile unicode per iniettare in segreto virgolette o caratteri di escape? Sei sicuro che la tua applicazione non verrà mai spostata su un altro RDBMS vulnerabile a questo tipo di attacchi (ad esempio anni se MSSQL viene abbandonato o chiaramente inferiore a un altro prodotto)?

    
risposta data 28.09.2011 - 21:27
fonte
-1

No.

Se devi interpolare, dovresti sempre usare il codice del modulo:

sql = "select * from table where param = " + quote_sql_value(value)

Dove quote_sql_value sostituisce ' con '' e racchiude il risultato con ' su entrambi i lati.

Si noti che MySQL e altri database hanno sequenze di escape che possono essere difficili da rilevare e codificare correttamente. Per quello che posso dire, sembra che MSSQL non abbia tale, quindi la codifica di un valore dovrebbe essere abbastanza semplice. Tuttavia, dovresti fare ulteriori ricerche sulla codifica MSSQL; non credetemi.

    
risposta data 28.09.2011 - 23:06
fonte

Leggi altre domande sui tag