• Sql Injection

    28 aprile 2007 | Sviluppo Web | Nessun Commento.

    SQL Injection: cos’è?

    In generale il sql injection è una tattica con cui un malintenzionato riesce ad eseguire qualsiasi operazione sul database, sia questa di aggiunta, modifica o cancellazione di dati. Se poi l’attaccante agisce su Sql Server, MySql o simili, i pericoli sono ancora maggiori: basti pensare a cosa potrebbe fare una volta acquisiti i permessi di amministratore.

    Come funziona

    Il sql injection prevede l’inserimento di istruzioni sql nella query di interrogazione del database. Per un esempio, basta pensare ad una pagina di login con i due campi nome utente e password. Un malintenzionato può inserire qualsiasi istruzione SQL nel primo campo semplicemente scrivendo: ‘comando. L’apostrofo (’) infatti segna la fine della stringa. Ecco a confronto le due query che potrebbero venire fuori dalla tecnica precedente, la prima è quella corretta, la seconda è quella contraffatta:

    SELECT * FROM utenti WHERE
    nome = 'minifloppy' AND password = 'webmaster'
    
    SELECT * FROM utenti WHERE
    nome = '';query contraffatta--AND password = 'webmaster'
    

    I cracker sono ancora più facilitati se nel form viene richiesto un valore numerico. In questo caso basterebbe semplicemente inserire la query contraffatta.

    Come difendersi

    Le difese possono essere principalmente tre:

    • Cercare di far diventare l’input corretto
    • Non accettare input che è stato riconosciuto come non corretto
    • Accettare solo input corretto

    La prima è decisamente da scartare perchè modificando l’input potremmo incorrere in molti problemi. Primo fra tutti è quello del riconoscere l’input scorretto, soprattutto perchè di input scorretti ne vengono scoperti in ogni momento di nuovi. Secondo la modifica protrebbe alterare la lunghezza ed il contenuto.

    Anche la seconda presenta gli stessi inconvenienti della prima, quindi l’unica utilizzabile in modo sicuro è la terza. Di seguito è riportato un esempio pratico (in ASP) per ogni approccio possibile:

    <%
    'Esempio n.1
    'Facciamo diventare corretto l'input sostituendo l'apostrofo con altri due
    
    function controlla(input)
         input = replace(input, "'", "''")
         controlla = input
    end function
    %>
    
    <%
    'Esempio n.2
    'Controlliamo che l'input sia corretto
    function controlla2(input)
         aScorretto = array( "select", "insert", "update", "delete", "drop",
    "--", "'" )
         controlla2 = true
    
         for i = lbound(aScorretto) to ubound(aScorretto)
    
              if ( instr( 1, input, aScorretto(i), vbtextcompare ) <> 0 )
    then
                   controlla2 = false
                   exit function
              end if
    
         next
    
    end function
    %>
    
    <%
    'Esempio n.3
    'Accettiamo solo l'input corretto
    function controlla3(input)
         strChars =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
         controlla3 = true
    
         for i = 1 to len(input)
              c = mid( input, i, 1 )
    
              if ( InStr( strChars, c ) = 0 ) then
                   controlla3 = false
                   exit function
              end if
    
         next
    end function
    %>
    

    Conclusioni

    Come abbiamo visto validare gli input è molto importante, pena database in pericolo. Eseguire controlli non significa quindi sprecare tempo e risorse, ma rendere la nostra applicazione più affidabile e sicura.