Ottenere un'iniezione SQL dopo una determinata regex [duplicato]

1

Mi è stata mostrata una regex che, per chi l'ha scritta, dovrebbe proteggere dalle iniezioni SQL su SQL Server 2008. Non sembra proprio così, ma mi chiedo esattamente quale codice posso superare per dimostrare che non protegge.

value = Regex.Replace(userInput, "[\n\r\t\']", " ");
sqlCmd = "Select names from mytable where mycolumn like '%" + value + %'";
SQLDataAdapter results = new SQLDataAdapter(sqlCmd, connString);

Ora, ho capito che se riesco a ottenere una singola citazione, posso fare qualcosa di simile

a' union all select passwords as names from myusertable;--

Il problema è che la regex cattura la citazione singola e non ho idea di come fuggire / codificare / ect. per superare la regex. Ho cercato qualcosa, ma tutto sembra presupporre che puoi ottenere una singola citazione. Ovviamente non può essere così semplice fermare tutti gli attacchi SQL injection, ma personalmente non so cosa mettere per superarlo. Qualche aiuto?

Modifica:

Per essere un po 'più specifico, ho sentito che si possono usare caratteri unicode per inserire una virgoletta singola oltre un assegno in molte lingue dato che ci sono caratteri unicode che sono trattati come tali dal linguaggio di programmazione, ma quando ottengono al database, sono appena trattati come una citazione. Ma su questo non ho trovato altro che teoria. Quando cerco di spiegarlo, sembra che "Beh, la gente pensa che questo potrebbe accadere, ma non è mai stato dimostrato che sia effettivamente una vulnerabilità" e questo non convince il senior che lo ha programmato.

    
posta Lawtonfogle 23.08.2013 - 23:10
fonte

2 risposte

3

Per espressioni regolari complesse dovresti usare un regex debugger . Comunque questa regex è semplicemente semplice. In breve, è necessario trovare una query suscettibile all'iniezione senza utilizzare virgolette singole. si assume la seguente query:

value = Regex.Replace(userInput, "[\n\r\t\']", " ");
sqlCmd = "Select names from mytable where mycolumn = '" + value1 + ' and yourcolumn= '"+value2+"';

ora questo può essere sfruttato usando il seguente PoC:

let value1 = \
let value2 = union select password from myusertable-- 1

Questo produrrà la seguente query:

Select names from mytable where mycolumn = '\' and yourcolumn=' union select password from myusertable-- 1'

Un paio di modifiche, la maggior parte dei gestori delle connessioni non consente l'impilamento delle query, quindi ; è solo inutile, il commento -- è in realtà un commento di tre caratteri che termina con uno spazio in modo che -- 1 assicuri che il commento sia rispettato anche se lo spazio bianco viene troncato. Sostituendo le virgolette singole, questo metodo di sanificazione è migliore di addslashes, poiché non è vulnerabile agli attacchi multibyte: addslashes vs mysql_real_escape_string

    
risposta data 24.08.2013 - 00:31
fonte
1

In alcuni contesti è possibile che ci possano essere altre manipolazioni di stringhe o cose con codifica di entità HTML o codifica url che consentiranno l'inserimento della singola virgoletta in un secondo momento.

Tuttavia, se l'ultima cosa che fai è rimuovere la citazione singola, sarà rimossa. Se rimuovi prima le virgolette singole, allora esegui un qualche tipo di decodifica, c'è la possibilità che possa passare. Puoi anche prendere in considerazione la codifica dei tuoi dati nel database in modo che la corrispondenza sia su stringhe codificate e non sull'inglese semplice.

In alcuni casi, ci sono sistemi che fanno cose strane con caratteri speciali o caratteri UTF non ASCII che possono causare problemi con l'iniezione. Le tecniche in questo settore vengono spesso definite come contrabbando SQL e trofia omoglyica. Vedi questo documento OWASP .

Potrebbero esserci altri scenari di casi d'uso. Vedi questa domanda correlata su SO: SQL Injection dopo aver rimosso tutto virgolette singole e trattini-caratteri .

Altre referenze:

risposta data 24.08.2013 - 00:16
fonte

Leggi altre domande sui tag