Jump to content
gicaprazzz

[Tutorial]Blind SQL Injection

Recommended Posts

Dedicatie pentru Nytro.

[offtopic: va rog sa nu va suparati pe mine ca am ceva cu Nytro si sa nu ma judecati dupa asta]

Ma adresez aici in special celor care cunosc limbajul de interogare SQL si "tehnica" SQL Injection.

Presupunem urmatoarea interogare SQL:

Select * From users Where email = '$login_email' AND password = '$login_password'

unde $login_email -> textul introdus de utilizator la logare in campul pentru e-mail, iar $login_password -> textul introdus in campul pentru parola.

daca $login_password = ' or ''=', comanda rezultata va fi:

Select * From users Where email = '$login_email' AND password = '' or ''='', deci conditia finala va deveni adevarata pentru orice e-mail, ceea ce inseamna ca ne putem autentifica fara a cunoaste parola corecta pentru emailul ales.

Daca modificam interogarea SQL aftfel incat conditia sa fie falsa (ex: Select * From users Where email = '$login_email' AND password = '' AND 'x'='y') atunci nu vom reusi sa ne logam (evident interogarea nu va returna nici o inregistrare din tabel pentru care 'x'='y'). Gandindu-ne invers, putem sti sigur daca o anumita conditie pe care am pus-o in interogarea SQL este sau nu adevarata, verificand daca am reusit sa ne logam. In acest fel putem presupune si verifica anumite informatii privitoare la serverul SQL, la baza de date, la tabele... Trebuie doar sa modificam comanda SQL pentru a ne indica daca un anumit raspuns corespunde cu presupunerea facuta de noi.

EXEMPLU. Dorim sa aflam versiunea unui server MySQL. Presupunem ca versiunea este 5.0.1.3 si modificam comanda SQL astfel:

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND version() = '5.0.1.3'

presupunand ca exista userul gigel cu adresa specificata si ca parola este corecta, logarea va depinde de valoarea de adevar a expresiei version()='5.0.1.3'.

Nu putem incerca insa toate combinatiile posibile de 1, 2, 3, 4, 5, 6, 7... caractere pentru a verifica un indicator precum versiunea. Un calcul simplu ne arata ca exista 26 * 2 litere (MARI + mici) + 10 cifre + aprox. 20 semne de punctuatie = 26 * 2 + 10 + 20 = 82 caractere. Astfel avem in total 82^1 moduri de a combina 1 caracter, 82^2 moduri de a combina 2 caractere, ... Inductia ne arata ca sunt in total 82^n moduri de a combina intre ele cele 82 caractere intr-un cuvant de lungime n. Astfe, pentru 5.0.1.3 am avea 82^7 incercari (numarul total), un numar aproape astronomic, care s-ar rasfrange intr-un timp de executie imens.

Salvarea noastra in acest caz se numeste MID, o functie MySQL care extrage un subsir dintr-un sir de caractere. Sintaxa acestei functii este:

MID(strEXPR text, intEXPR start, intEXPR length), cu urmatoarele semnificatii ale parametrilor:

text - o expresie de tipul string din care dorim sa extragem un subsir

start - pozitia de la care incepem sa extragem caractere (1 reprezinta primul caracter din <<text>>)

length - numarul de caractere extrase

Vom modifica comanda astfel incat sa gasim pe rand fiecare caracter din rezultatul de care avem nevoie (in acest caz version()):

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND Mid(version(),1,1) = '5'

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND Mid(version(),2,1) = '.'

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND Mid(version(),3,1) = '0'

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND Mid(version(),4,1) = '.'

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND Mid(version(),5,1) = '1'

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND Mid(version(),6,1) = '.'

Select * From users Where email = 'gigel@mymail.com' AND password = 'parola_lui_gigel' AND Mid(version(),7,1) = '3'

Toate aceste interogari sunt adevarate, observand ca primul caracter este '5', al doilea este '.', samd... Astfel, ceea ce ne ramae de facut este sa incercam pentru fiecare pozitie cele 82 de caractere posibile, avand astfel 82 * n incercari in total, un numar neinsemnat pe langa 82 ^ n.

Voi completa cu cod sursa in momentul in care cineva va fi interesat. Voi propune si niste tehnici euristice de optimizare a procesului, dar doar in acelasi caz.

Multumesc, Gica Prazzz :)) [ce naspa suna numele...]

Link to comment
Share on other sites

Normal ca nu am gagica , cui i-ar place un pitic , gras si plin de cosuri ca mine ? Plus ca sunt tocilar , stau toata ziua si invat sa fac keyloggere . Si nu ma asteptam de la unul ca tine sa foloseasca cuvinte ca "pula" . Esti prea ratat sa sti ce inseamna viata . Pentru tine viata inseamna matematica , fizica si algoritmi . Daca ai mai iesi din casa poate ai vedea si tu altceva in afara de coduri care nu contin variabile cu numele "pula" . Ramai la algoritmii tai , invata toata ziua sa te lauzi ca esti mai bun ca mine . Eu mai stau un scurt timp pe forumuri si ma tirez . Distractie placuta la toceala . A , pot sa te intreb ce medii ai la scoala ?

Link to comment
Share on other sites

9,75 ... Ce sa mai zic ... Cat timp pe zi stai si inveti ? Sincer imi pare rau de tine . Am vazut cum programezi si mi-am dat seama ca esti mult prea bun , nici nu ma compar cu tine . A , inca nu am spus , in viitor nu vreau sa fiu programator . Vreau ... Altceva . Pastrez pentru mine .

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...