PDA

View Full Version : **ATTENZIONE**ASSOLUTA NON SICUREZZA DI ASP E DATABASE!!!!!


@GuyBrush@
12-05-2003, 09:47
C'è un modo x iniettare sql dalla url... e può farlo chiunque conoscendo un minimo del db!!! (nel mio caso SQL server 2000)


Mettendo una stringa tipo :

https://www.sito.net/news/news2.asp?ID=297;%20UPDATE%20[News]%20SET%20[description]%20=%20'1'%20WHERE%20[ID]%20=%201

ESEGUE L'SQL!!!!

C'è un modo x risolverlo???

Praticamente se io nella pagina faccio
"SELECT * WHERE ID=297" quando acquisisco L'ID dall'URL la select diventa:::

"SELECT * FROM ID=297; UPDATE ....ETC"

IL ";" dice di eseguire la prox istruzione....!!!!
:sofico:

cionci
12-05-2003, 11:03
Interessante questa cosa... Non ci avevo mai pensato... Credo che la cosa più semplice sia fare un cast a intero (CInt()) della variabile presa dalla querystring...

Se il parametro è una stringa l'unica cosa che si può fare è controllare che non contenga un apice...

@GuyBrush@
12-05-2003, 11:09
e se la variabile è un LOGIN???? es."PIPPO"
cioè... vuole dire cambiare ogni pagina del sito :cry: :cry: :cry:

@GuyBrush@
12-05-2003, 11:13
anzi, se metto CINT può essere che canna l'ID

se ID=29 ; SELECT....

se il CINT fosse sul 29, ok
ma se il CIN PRende tutta la stringa... che casino!!!

cionci
12-05-2003, 11:20
Originally posted by "@GuyBrush@"

ma se il CIN PRende tutta la stringa... che casino!!!
In teoria dovrebbe prenderti solo il 29... Se prende tutta la stringa dovrebbe generare un errore e quindi ci copriamo le chapet...

@GuyBrush@
12-05-2003, 11:24
non prende solo il 29:

se passo PAG.asp?ID=29;select...

il separatore delle variabili passate è il "&" non essendoci prende tutto..

inquesto caso eseguirebbe

SELECT * FROM TABELLA WHERE ID=29;UPDATE .....

il ";" funge da separatore dell'sql... e esegue la II parte come nuova istruzione... :cry:

cionci
12-05-2003, 11:29
Sì, ma se converti con CInt ti rende solo il 29...

@GuyBrush@
12-05-2003, 11:34
secondo me se passo

xx.asp?ID=29;update

prende "29;UPDATE..." come stringa...

cionci
12-05-2003, 11:38
Originally posted by "@GuyBrush@"

secondo me se passo

xx.asp?ID=29;update

prende "29;UPDATE..." come stringa...
Certom, ma se converti quella stringa ad intero con Cint ti dovrebbe prendere solo il 29 !!!

@GuyBrush@
12-05-2003, 11:42
ok ,mi fido :D
e nel caso in cui passo

..LOG="PIPPO" ...

:cry:

cionci
12-05-2003, 11:50
Originally posted by "@GuyBrush@"

ok ,mi fido :D
e nel caso in cui passo

..LOG="PIPPO" ...

:cry:
In ogni caso puoi sempre provare ;)

Nel caso tu passi una stringa puoi verificare che all'interno della stringa non ci sia un apice o un doppio apice (dipende da cosa usi nella query)...

Mezzetti0903
12-05-2003, 14:14
Mah... io controllo sempre che in qualunque stringa non siano presenti

Per i campi testuali....
' in questo caso li raddoppio

Per i campi numerici
; (solo per valori numerici nei database) in questo caso li tolgo
--- (il commento) anche questo... via
OR, AND....e compagnia.... e anche eventuali = ( non si sa mai... magari a certe cose non ci ho pensato)

...per il resto dovrei essere appostoo

leon84
12-05-2003, 14:58
Ragazzi mi fate capire bene questa storia ?

@GuyBrush@
12-05-2003, 15:03
Allora... hai un indirizzo che butta fuori un GET.
esempio

arrivi su

www.sito.it/pagina2.asp?ID=29

passi ID=29 (ti servirà x fare una select in un DB)

FAI CONTO CHE UN "mailintenzionato" cambia l'URL in

www.sito.it/pagina2.asp?ID=29;UPDATE ANAG SET NOME="CARLO"

Nella pagina avrai qualcosa del tipo

conn.execute("SELECT * FROM TABELLA WHERE ID=" & request("ID")

IN QUESTO CASO LA STRINGA CHE VIENE ESEGUITA E' :

SELECT * FROM TABELLA WHERE ID=29 ; UPDATE .....

IL ";" FA PASSARE l'SQL all'istruzione successiva che è l'UPDATE fatto dal lamer...

IN pratica, può iniettare SQL quando vuole... basta che azzecca i nomi delle tabelle.... (che in genere sono gli stessi...)

capito?

@GuyBrush@
12-05-2003, 15:05
è come se fai:

conn.execute("SELECT...")
conn.execute("UPDATE..")

leon84
12-05-2003, 15:19
P :eek: orca miseria ??????????????? Certo che ho capito ...... E non si può risolvere ?

Mezzetti0903
12-05-2003, 15:20
Oppure per i campi di testo per esempio...bisogna controllare gli apici perchè per esempio....

io eseguo la seguente stringa sql e guardo se restituisce un utente...se sì allora gli assegno le autorizzazioni

"SELECT * FROM UTENTI WHERE USER = '"+user+"' AND PASS = '"+pass+"' "

se user e pass non venissero controllate ed avessero il valore

' OR '' = '

la stringa diventerebbe

"SELECT * FROM UTENTI WHERE USER = '' OR '' = '' AND PASS = '' OR '' = '' "

siccome '' = '' è sempre vera la query mi restituirebbe TUTTI i cami del database.... e visto che di solito quello dell'amministratore è il primo ad essere inserito... non si può escludere di avere privilegi di amministratore...

almeno... nelle mie appl è così.... (non ci contate.... è tutto controllato :sofico: )

@GuyBrush@
12-05-2003, 21:17
nel mio caso purtroppo no,,, ma se la query è su un altra tabella (es. quella che gestiscele nwes)... punto a capo...

edivad82
13-05-2003, 00:54
solitamente per variabili non filtrate per le query e parametri semi-importanti si usano le sessioni/variabili applicazione oppure si salvano le sessioni in database come se si stesse lavorando su server web in cluster...lasciare i parametri scoperti in questo modo non è mai conveniente...il controllo dei dati da mettere in query è la prima cosa da fare ;)
ma soprattutto evitare il passaggio di stringhe ma solo di indici e interi in modo da poter essere controllati con più facilità

maxithron
14-05-2003, 01:39
ho un po di spazio web disponibile per fare qualche testing.

anche a me interessa molto questa cosa.

Siete grandi!

@GuyBrush@
14-05-2003, 08:32
ve lo dico xkè giusto ieri ci hanno hackato.. attualmente i nostri 3 siti li ho messi offline e devo ricontrollarmi ogni pagina x precauzione, filtrando ogni passaggio parametri...

ah.-.. se il programmatore che c'era prima avesse passato un po + d tempo a mettere in sicurezza il sito...

Cmq, fate attenzione a questo problema... il ";" è davvero pericoloso...

maxithron
21-05-2003, 12:51
Premetto che non uso ASP ma bensì PHP... :D

Ammotto di non aver mai affrontato il problema; che vi informo è presente anche nelle pagine generate con PHP.

Il problema sostanziale è che il ";" permette di esegiure 2 query in serie, e dato che nelle mie pagine non capita che in una unica chiamate SQL faccio fare due query, ecco come ho risolto.


sostituisco alla funzione che opera la query un fatta da me: ExecQuery($sql);

che + o - opera così:


function ExecQuery($sql)
{
if(substr_count($sql, ";")>0)
{
//INTRUSIONE
}
else
{
//tuutto ok
}
}


in pratica controllo se c'è un ";" di troppo nella query..
:cool:

maxithron
21-05-2003, 21:41
...a parte l'ottimo italiano in cui ho postato.....sembra funzionare e...ehm
(ammotto.....ah ah ah :p )

cionci
22-05-2003, 00:13
A meno che nella query non ci sia un controllo su un testo che contiene un punto e virgola funziona...

cgiova
22-05-2003, 19:14
il problema di sql injection può coinvolgere tutti i linguaggi di programmazione dinamica (non solo asp) e anche se si usa il POST per passare parametri...

bastano un paio di funzioni per evitare il peggio comunque...

utilizzando il punto e virgola l'attaccante dovrebbe conoscere il database(cosa che non avviene normalmente), il vero pericolo sono le stringhe grimaldello come già detto da Mezzetti0903 ...

non avete neanche un'idea di quante applicazioni più o meno fatte in casa si possano "bucare" con questo sistema...

maxithron
23-05-2003, 01:04
Originally posted by "cgiova"



non avete neanche un'idea di quante applicazioni più o meno fatte in casa si possano "bucare" con questo sistema...

stai tranquillo che ne abbiamo..... :p

cmq, la soluzione proposta prima da me(almeno in php) sembra fungere...

ripeto il mio invito...se vi va ho un pò di spazio sul web per provare un pò di cose.. ;)

@GuyBrush@
23-05-2003, 09:31
io ora uso asp ,... cmq so anche php.-..

con asp faccio il controllo di tutte i parametri passati e guardo se hanno all'interno:
; -- ' ( ) SELECT DELETE UPDATE

i primi 3 li conoscete ...
le parentesi le tolgo xkè se (es.) prendo il login e pw da una text... potrei fare:

VALORE LOGIN : LOGINVERA
VALORE PW : (SELECT PASSWORD FROM TABELLA WHERE LOGIN="LOGINVERA")