Injection SQL Hard Filtre
|
31-08-2012, 18h20
Message : #1
|
|
oxame
Newbie Messages : 17 Sujets : 3 Points: 0 Inscription : Jun 2012 |
Injection SQL Hard Filtre
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. |
|
01-09-2012, 08h03
Message : #2
|
|
oxame
Newbie Messages : 17 Sujets : 3 Points: 0 Inscription : Jun 2012 |
RE: Injection SQL Hard Filtre
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/s...eet-mysql/ , ainsi que ce PDF http://websec.files.wordpress.com/2010/11/sqli2.pdf |
|
01-09-2012, 14h08
Message : #3
|
|
Luxerails
Bon membre Messages : 267 Sujets : 6 Points: 67 Inscription : Aug 2011 |
RE: Injection SQL Hard Filtre
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 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) |
|
01-09-2012, 17h49
Message : #4
|
|
oxame
Newbie Messages : 17 Sujets : 3 Points: 0 Inscription : Jun 2012 |
RE: Injection SQL Hard Filtre
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. |
|
01-09-2012, 17h59
Message : #5
|
|
Luxerails
Bon membre Messages : 267 Sujets : 6 Points: 67 Inscription : Aug 2011 |
RE: Injection SQL Hard Filtre
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. |
|
« Sujet précédent | Sujet suivant »
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
Injection SQL | acip | 12 | 4,063 |
28-07-2013, 20h30 Dernier message: gruik |
Utilisateur(s) parcourant ce sujet : 3 visiteur(s)