Come può essere eliminata questa funzione di disinfettante degli input?

10

C'è una classica applicazione ASP nel mio lavoro che è (credo) altamente vulnerabile all'iniezione SQL. Voglio dimostrare alla gestione che questo codice non sia sicuro, ma tutto ciò che sono in grado di fare è inserire i record di log "SQLINJ" nel database:

Public function preventSQLInjection(lstr)

    BlackList = Array("--", ";", "'", "/*", "*/", "@@", "@",_
                      "alter ", "begin ", "create ", "cursor ",_
                      "declare ", "delete ", "drop ", " end", "exec ",_
                      "execute ", "fetch ", "insert ", "kill ", "open ",_
                      "select ", "sysobjects", "syscolumns",_
                      "table ", "update ", "=")

    preventSQLInjection = lstr

        For Each s in BlackList      
        If ( InStr (lstr, s) <> 0 ) Then
            execSqlQuery "INSERT INTO AccesLogs (datetime,ip,action,comments) VALUES ('" & formatDate(date) & " " & formatTime(time) & "','" & request.ServerVariables("REMOTE_ADDR") & "','SQLINJ','" & replace(lstr,"'","''") & "')",connectionstring
            preventSQLInjection = "DONOTUSEIT"
            exit for
        End If  
    Next

end function

Da quanto ho capito, l'attacco più semplice sarebbe stato sulla tabella AccessLogs , a causa di replace(lstr,"'","''") che "sanifica" il tentativo di SQL-Injection e lo registra.

SO che questo codice dovrebbe essere abbandonato e tutti gli SQL eseguibili dovrebbero essere eseguiti con comandi e parametri effettivi - Odio le stringhe concatenate con passione.

Voglio dimostrare alla direzione che la pagina è molto vulnerabile, come sysobjects è nella lista nera, ma non sys.objects quindi se posso iniettare SQL eseguibile deve essere possibile ottenere l'intero schema del database senza sudare.

Come può questa funzione essere sconfitta, diciamo, dai campi username e password sulla pagina login.asp ? O sto facendo tutto questo e questo codice è perfettamente sicuro?

    
posta Mathieu Guindon 10.02.2014 - 21:07
fonte

2 risposte

5

I want to prove to management that this code isn't secure

Potresti passare il resto della tua (forse breve) carriera facendo così, più e più volte mentre aggiungono alla lista nera. Suggerisco di cercare di educarli invece.

Leggi il foglio Cheat dell'iniezione di OWASP SQL e i fogli correlati a cui fa riferimento, quindi puoi presentarlo a i responsabili delle decisioni e rispondere alle domande razionalmente - OWASP è una fonte molto stimabile.

Leggi anche Why We Should Not Roll Our Own - in particolare, l'esempio di Phil Zimmerman è un esempio , da un ben noto crittografo, del perché "beh, non posso sconfiggerlo" non significa che "sia" sicuro.

Se devi provare a fornire un esempio, prova a giocare con varie codifiche; esadecimale è chiaramente consentito, quindi tira su Tabella ASCII per l'uso con 0x e CHAR (), e forse anche giocare con Caratteri di escape HTML o Unicode (UCS-2, per SQL Server).

Verifica se puoi anche utilizzare 'set quoted_identifier off'.

Come hanno detto i kiBytes, prova il caso misto: le regole di confronto di SQL Server più comuni sono tutte senza distinzione tra maiuscole e minuscole.

Se qualcosa funziona, devi tornare a istruirli che solo perché hai trovato N buchi non significa che non ci siano X buchi rimasti, alcuni dei quali non troverai prima che gli attaccanti lo facciano.

    
risposta data 11.02.2014 - 03:53
fonte
3

Non riesco a testarlo, ma la documentazione dice che la funzione " InStr" fa distinzione tra maiuscole e minuscole, quindi credo che tu possa utilizzare qualsiasi token ma i simboli in maiuscolo:

    
risposta data 10.02.2014 - 21:29
fonte

Leggi altre domande sui tag