>> Torna all'Homepage <<
Contattaci Entra nei forum Cerca nel sito
News della settimana ASP: esempi di pagine dinamiche Trucchi e suggerimenti per il PC Manuali e guide I dossier e gli approfondimenti di AmicoPc Il sito della settimana I racconti di Armando Staffa Chi siamo
     
 

 


Guarda il sistema
in funzione

 


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.

<< indietro

Utenti connessi: 117

Invia questa pagina ad un amico

 

 

 

Chi siamo | Pubblicità | Note sulla privacy | Dicono di noi
Grafica cura di Paolo Omero
- Stefania Migliorucci