|

GESTIONE UTENTI: PROBLEMI DI SICUREZZA

Il
metodo che abbiamo visto è tutt'altro che sicuro.
Infatti un sistema così strutturato è
facilmente vulnerabile: non servono strumenti informatici
complessi o grandi competenze.
E' sufficiente conoscere un po' di SQL (Structured Query
Language), ovvero il linguaggio utilizzato per scrivere
le query utilizzate nelle pagine ASP (per intenderci
quel select * from.... che utilizziamo normalmente
per prelevare informazioni dal database).
Provate
ad andare al modulo in cui inserire username e password
(http://www.ilserver.com/test/pwd/index.htm)
e, nel form chiamato Procedura Sbagliata (ovvero
quella vista nella pagina precedente) provate ad inserire
i seguenti dati così come sono scritti:
username:
xxx (o qualsiasi lettera a vostro piacere)
password: ' or '1'='1 (o '2'='2, '3'='3,
'y'='y...)
Vedrete
che vi verrà caricata la pagina protetta
(prima.asp) salutandovi come se voi foste l'utente chiamato
primo.
In pratica noi siamo riusciti ad entrare al posto
del primo utente del database anche se non conoscevamo
né il suo username né la sua password.
Adesso sappiamo che il primo utente registrato si chiama
primo. Questa però è un'informazione
che non conoscevamo: infatti al posto dello username
abbiamo inserito delle lettere a caso. Quello
che ci ha permesso di entrare è la stringa di
codice inserita al posto della password.
Questo metodo l'ho visto per la prima volta sul
sito RedAngel.it.
Partendo dalla tecnica illustrata ho però voluto
approfondire l'argomento cercando (e trovando ;-)) un
modo per entrare al posto di un determinato utente.
Infatti il mio scopo non è solo quello di visualizzare
l'area riservata. Io voglio essere in grado di entrare
facendo credere al sistema di essere un determinato
utente (anche se in realtà non sono nemmeno registrato...).
Comiciamo
però a capire che cosa è successo.
Io ho inserito al posto dello username una serie casuale
di caratteri (nell'esempio si tratta di tre X). Quindi
la pagina che controlla username e password confrontandoli
con quelli presenti nel database (ovvero la pagina check.asp)
avrà la variabile user con associato il
valore xxx.
La variabile pwd invece contiene la stringa
' or '1'='1
Ora
la pagina check.asp si connette al database ed
esegue la query di selezione. Questa ha la forma
"select
* from pwd where user like '"& user &"' and pwd like
'"& pwd &"'"
la
cui traduzione è:
"selezionami tutto (select *) partendo dalla
tabella pwd (from pwd) dove il campo user
(where user) è uguale alla variabile user
(like '"& user&"') e il campo
pwd (and pwd) è uguale alla variabile
pwd (like '"& pwd &"'")"
La
parte che ci interessa è
"
...user like '"& user &"' and pwd like '"& pwd &"'"
Per
esempio, inserendo come username primo e come
password 001 la stringa diventa
"
...user like 'primo' and pwd like '001'"
ovvero
sostituisco "& user &" con
la parola primo e "& pwd &"
con la parola 001.
Se
invece utilizziamo user=XXX e pwd=' or '1'='1 la query
diventa
"
...user like 'xxx' and pwd like ' ' or '1'='1' "
ovvero
chiediamo di selezionare il record dove il campo user
corrisponde a xxx e il campo pwd è
invece vuoto (pwd = ' '). Così facendo
non viene trovato nessun record che soddisfa queste
condizioni, quindi, teoricamente, dovrebbe essere visualizzata
la pagina di errore.
Però c'è la seconda parte della stringa:
or '1' = '1'.
Strutturando così la query in pratica chiedo
di trovare un record che abbia il campo user e il campo
pwd specificati oppure (or) di visualizzare
un record che soddisfi la condizione '1' = '1'.
Dato che quest'ultima condizione è sempre vera
(per questo che possiamo utilizzare 2=2, 3=3, y=y...)
la selezione mi visualizza il primo record del database.
Quindi la query cerca sia i record con quella determinata
accoppiata di user e pwd ma anche i record che soddisfano
la condizione 1=1. Così facendo sono sicuro di
avere almeno un risultato!
In realtà tutti i record soddisfano questa condizione,
ma dato che chiedo di selezionare un solo record, la
query mi restituisce il primo che trova, ovvero il numero
uno.
Ecco
quindi spiegato come entrare in un'area riservata senza
bisogno di conoscere username e password: inserire qualche
lettera nel campo user (se lo lascio vuoto posso
avere un messaggio di errore che mi invita ad inserire
il 'mio' nome utente), mentre nel campo password inserisco
un apice per chiudere la parte pwd like ' (in
modo da avere pwd = ''), la parola or
e una condizione necessariamente vera (1=1, 2=2, ''
= ''...).
Quest'ultima condizione deve essere scritta nel modo
seguente '1'='1: l'ultimo apice non lo scrivo in quanto
è già presente nella stringa di selezione
(infatti questa finisce con pwd &" ' ").
Con
questo metodo siamo in grado di entrare in aree riservate
senza bisogno di essere utenti registrati. Ancora meglio:
facciamo credere di essere quel primo utente che si
è registrato al servizio.
Siamo entrati alposto di quell'utente senza conoscerne
né il nome utente né la password!!!
Dato
però che essere entrati al posto del primo utente
non ci basta, vediamo il modo di autenticarci di volta
in volta come utenti diversi.
|