N-PN White-Hat Project
Injection SQL Hard Filtre - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Questions (https://dev.n-pn.fr/forum/forumdisplay.php?fid=11)
+--- Forum : Hacking (https://dev.n-pn.fr/forum/forumdisplay.php?fid=29)
+--- Sujet : Injection SQL Hard Filtre (/showthread.php?tid=2156)



Injection SQL Hard Filtre - oxame - 31-08-2012

Bonjour,

Je suis actuellement en train de buché sur une épreuve d'un autre site,
je vous rassure tout de suite je ne vous demande pas comment la réussir.

Je plante le décor :
tout est filtré AND, UNION, SELECT etc, je me suis donc rabattu sur les opérateur logique & | if() etc, mais comme j'ai besoin de trouvé le passe j'ai besoins d'opérateur sur les chaines de caractère,
j'ai supposé que je pouvais reconstitué ma commande LENGTH(password) = 32 avec
UNHEX(LOWER(CONCAT(CONV(4,5,35),CONV(11,11,36),..........))) et effectivement quand je mais cette suite dans un champ ex:
SELECT user,UNHEX(LOWER(CONCAT())) FROM users;

Je retrouve bien la chaine que j'ai codé, mais si je fait :

SELECT user FROM users WHERE user_id = 1 AND UNHEX(LOWER(CONCAT()));

J'ai droit a une erreur SQL
ou

SELECT user FROM users WHERE user_id = 0 | if((UNHEX(LOWER(CONCAT()))),1,0);

J'ai un Empty set.

Ne trouvant pas d'explication dans la doc Mysql je voudrais savoir si l'un d'entre vous a déjà utilisé cette cette méthode => UNHEX(LOWER(CONCAT()))) et si oui qu'est ce que je fait de mal et si cela n'est pas possible pourquoi ?? c'est considéré comme une chaine de caractère donc pas interprétable ou autre !!!

Merci d'avance.


RE: Injection SQL Hard Filtre - oxame - 01-09-2012

Bon personne n'a répondu,

dois je en conclure que personne ne sait ?
ou est ce du fait que cela concerne une épreuve sur un autre site ? si c'est ça et que vous trouvé que c'est déplacé de m'a part je vous présente mes excuses.

en tout cas j'ai trouvé une autre bizarrerie si j'encode => 1' AND '1'='0 avec UNHEX(LOWER(CONCAT())) le premier 1 et bien interprété par mysql mais pas la suite ...

Si d'autre personne sont intéressé par l'évasion des filtres sql je vous conseille ce blog http://websec.wordpress.com/2010/12/04/sqli-filter-evasion-cheat-sheet-mysql/ , ainsi que ce PDF http://websec.files.wordpress.com/2010/11/sqli2.pdf


RE: Injection SQL Hard Filtre - Luxerails - 01-09-2012

Commence déjà par essayer de trouver une injection qui te permet de connaître le résultat d'une condition.
Après tu pourra réfléchir à trouver la longueur du pass, puis au unhex, concat etc pour la blind a proprement parler.

Citation :j'ai supposé que je pouvais reconstitué ma commande LENGTH(password) = 32 avec
UNHEX(LOWER(CONCAT(CONV(4,5,35),CONV(11,11,36),..........))) et effectivement quand je mais cette suite dans un champ ex:
SELECT user,UNHEX(LOWER(CONCAT())) FROM users;

Je retrouve bien la chaine que j'ai codé

Oui, mais tu la retrouve sous forme de chaine justement ("LENGTH(password) = 32"). Mais ça ne va pas t'aider (il n'y a pas de fonction eval() ou quoi)


RE: Injection SQL Hard Filtre - oxame - 01-09-2012

Salut Luxerails,

Déja merci d'avoir répondu,

J'ai trouvé une injection qui marche :

mysql> select user,password from users WHERE user_id = if((1 = 1),1,0);
+-------+----------------------------------+
| user | password |
+-------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+-------+----------------------------------+
1 row in set (0.00 sec)

mysql> select user,password from users WHERE user_id = if((1 = 0),1,0);
Empty set (0.00 sec)

la c'est la copie de la sortie de mon serveur mysql, mais sur l'épreuve j'ai bien un membre existant / membre inconnue.

J'avais (enfin) finis par comprendre que mon UNHEX(CONTCAT(CONV())) était considéré comme une chaine de caractére et non pas comme une commande avec le test suivant :

mysql> SELECT user,HEX(password),HEX(LOWER(CONCAT(CONV([password])))) FROM users WHERE user_id = 1;
+-------+----------------------------------------------------------------------------+------------------------------------------+
| user | HEX(password) | HEX(LOWER(CONCAT(CONV([password])))) |
+-------+----------------------------------------------------------------------------+------------------------------------------+
| admin | 3566346463633362356161373635643631643833323764656238383263663939 | 307837303631373337333737366637323634 |
+-------+-----------------------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

J'avais trouvé sur ton site l'idée d'utilisé directement l'instruction en Hexa :
"LENGTH(password) = 32" => 0x4c454e4754482870617373776f726429203d203332;
ce qui marche en local:

mysql> SELECT user FROM users WHERE user_id = if((0x4c454e4754482870617373776f726429203d203332),1,0);
+-------+
| user |
+-------+
| admin |
+-------+
1 row in set (0.00 sec)

mais le UPPER du code PHP transforme le 0x en 0X et n'est donc plus interprété comme une instruction en hexa, j'ai pensé a faire un LOWER mais toutes les fonction sur les chaines de caractère sont filté, c'est pour cela que je m'était rabattu sur les UNHEX(CONTCAT(CONV())).

Donc j'ai la réponse a ma question c'est une chaine de caractère qui n'est pas interprété, quand j'aurais éliminé tout ce qui ne marche pas il ne resteras que la solution. Wink


RE: Injection SQL Hard Filtre - Luxerails - 01-09-2012

Effectivement, c'est n'est qu'une chaine de caractères. Donc la requete est finalement
if(('truc'),1,0)
Le string retourne vrai et donc le if() renvoie 1.

Bon courage, elle est galère cette épreuve. Tongue