|

GESTIONE UTENTI: PROBLEMI DI SICUREZZA

Per
ora siamo riusciti ad entrare come se fossimo il primo
utente registrato: vediamo ora come entrare al posto
dell'utente numero due.
La prima cosa che ci serve è sapere come si chiamano
i campi del database in cui sono memorizzati il nome
utente e la password: infatti senza queste informazioni
non possiamo far nulla.
Teoricamente queste informazioni non sono disponibili,
in quanto non abbiamo possibilità di metter mano
al database (se così fosse non avremmo bisogno
di tanto lavoro....). Di fatto invece possiamo venirne
a conoscenza e in un modo decisamente semplice: basta
inserire nel campo dello username la seguente riga
'
select *
Così
facendo la query di selezione della pagina check.asp
diventa
"
select * form pwd where user like '' select * and pwd
like ' ' ''
che
genera necessariamente un codice di errore.
Il messaggio di errore mostrato a video è il
seguente:
Microsoft
OLE DB Provider for ODBC Drivers errore "80040e14'
[Microsoft][Driver ODBC Microsoft Access] Errore di
sintassi. nell'espressione della query 'user like ''
select *' and pwd like '''.
http://www.amicopc.com/test/pwd/sbagliato/check.asp,
riga 10
La
parte che a noi interessa è ...user like ''
select *' and pwd like... La pagina di errore ci
mostra a video la parte della query che ha generato
l'errore, ovvero quella che deve confrontare i dati
inseriti con quelli presenti nel database. In questa
frase sono contenuti i nomi dei campi in cui sono memorizzati
il nome utente e la password, che appunto sono
user e pwd.
A
questo punto torniamo al nostro modulo e inseriamo alcuni
caratteri nel campo per il nome utente; nel campo per
la password scriviamo:
'
or '1'='1' and user<>'primo
dove
user è il nome del campo in cui sono
memorizzati tutti i nomi degli utenti mentre primo
è lo username dell'utente conosciuto con il metodo
spiegato nella pagina precedente.
Premendo
il tasto ENTRA questi dati vengono inviati alla pagina
di controllo check.asp, la quale li confronta
con quelli del database.
In questo caso la query di selezione diventa:
"select
* from pwd where user
like 'xxx' and pwd like ' ' or '1'='1' and user <>
'primo' "
Mediante
questa riga chiediamo di selezionare dal database i
record con i campi user = XXX e il campo password
vuoto (pwd=''); oltre a questi chiediamo di selezionare
i record che soddisfano la condizione 1=1 il cui campo
user sia diverso da primo.
La prima parte della selezione non produce alcun
risultato. La seconda condizione (1=1...) invece
è sempre verificata, quindi va bene qualsiasi
record. Dato però che il primo record già
lo conosciamo (quello del primo utente), ecco che inserisco
un'ulteriore condizione: il campo user del record
non deve contenere la parola primo (...<>
'primo').
In questo modo il record relativo al primo utente non
soddisfa questa condizione; quindi ci spostiamo in avanti
finche' non torviamo un altro record che la soddisfi
(ovvero il secondo).
In
questo modo possiamo autenticarci già come due
utenti: quello che si è registrao per primo e
quello che si è registrato come secondo.
Utilizzando
sempre questo metodo possiamo autenticarci come se fossimo
il terzo utente semplicemente scrivendo
'
or '1'='1' and user<>'primo' and user <>
'secondo
dove
primo e secondo sono gli username degli
utenti appena trovati (ricordarsi di non scrivere l'ultimo
apice!).
Continuando con questo metodo possiamo entrare di volta
in volta come utenti diversi, semplicemente aggiungendo
and user <> xxx...
Se
però io volessi entrare al posto di un utente
specifico?
Nel caso di database con migliaia di utenti questo sistema
non sarebbe utilizzabile, sia perché richiede
tempi particolarmente lunghi, sia perché i campi
di testo utilizzati hanno una lunghezza massima di 255
caratteri, oltre ai quali non è possibile scrivere
nient'altro.
Dobbiamo quindi arrenderci?
|