[PHP] Probleme requette sql

Probleme requette sql [PHP] - PHP - Programmation

Marsh Posté le 12-02-2007 à 11:52:41    

Bonjour a tous.
Lorsque je fait requete dans phpmyadmin elle fonctionne mais lorsque je linsere dan mon code php ca ne marche plus. Avezvous une reponse. Merci
Voilala requete:
 
 $sql = 'SELECT * FROM `user` WHERE `login` LIKE \ 'dilob\' AND `pass` LIKE \'asd\' LIMIT 0, 30 ';  
 
L'erreur affichee est :
 
"Query was empty" alors que dans phpmyadmin il m'affiche bin la ligne contenant le login dilob et le pass asd


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 12-02-2007 à 11:52:41   

Reply

Marsh Posté le 12-02-2007 à 12:02:47    

tu peux montrer ton code php: connexion à la base, execution de la requete et recupération des résultats, stp ?
edit: mais à l'instinct, je voterais pour un rtfm.

Message cité 1 fois
Message édité par anapajari le 12-02-2007 à 12:03:18
Reply

Marsh Posté le 12-02-2007 à 12:39:37    

anapajari a écrit :

tu peux montrer ton code php: connexion à la base, execution de la requete et recupération des résultats, stp ?
edit: mais à l'instinct, je voterais pour un rtfm.


 
Voila mon code
function auth_user($login, $pass, $link)
{
 
 $db_selected = mysql_select_db('site');
if (!$db_selected)  
{
   die('Impossible de se connecter : ' . mysql_error());
}
 
  $selection = "SELECT * FROM `user` WHERE `login` LIKE 'dilob' AND `pass` LIKE 'asd' LIMIT 0, 30 ";
 
 $result =  mysql_query($seletion);
if (!$result)  
  {
    echo "Impossible d'executer la requete ($sql) dans la base : " . mysql_error();
    exit;
  }
 var_dump($result);
 
 echo $result;
 
 if (mysql_num_rows($result) == 0)  
   {
     echo "Aucune ligne trouve, rien a afficher.";
     exit;
   }
 
 
while ($row = mysql_fetch_assoc($result))  
{
   echo $row['pass'];
   echo $row['login'];
}
 


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 12-02-2007 à 13:27:15    

 $selection = "SELECT * FROM `user` WHERE `login` LIKE 'dilob' AND `pass` LIKE 'asd' LIMIT 0, 30 ";
 
 $result =  mysql_query($seletion);  
 
:o

Reply

Marsh Posté le 12-02-2007 à 13:35:53    

anapajari a écrit :

$selection = "SELECT * FROM `user` WHERE `login` LIKE 'dilob' AND `pass` LIKE 'asd' LIMIT 0, 30 ";
 
 $result =  mysql_query($seletion);  
 
:o


 
Ok, c'est cool. Ca fait un bout de temps que je cherche, Une erreur bete encore.
Maintenant imaginons qu'a la place de 'dilob' et 'asd' jai $login_in_db et $pass_in_db et que ensuite je les comparent a un formulaire(champs login + champs mot de passe) rempli par l'utilisateur.
Lorsque je met les variable ca ne marche pas.En faite je ne voit pas trop comment faire pour comparer ce que saisi l'utilisateur par rapport au contenu de la base de donnee.
Pourrai tu me dire comment faire ca srrai vraiment sympa de ta part
 
 
je fait un truk du genre :
$login = $_POST['login'];  
$pass = $_POST['pass'];
 
if(pass_in_db == $pass && login_in_db == $login)
echo "Authentification reussie";
else
echo "Auth echouee";
 
 
 


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 12-02-2007 à 13:48:39    

pass_in_db et login_in_db, elles sortent d'où ces variables :??:
Tout ce que t'as à faire en gros (après, faut gérer le pb du sql injection) :  

Code :
  1. $login = mysql_real_escape_string(stripslashes($_POST['login']), $link); 
  2. $pass = mysql_real_escape_string(stripslashes($_POST['pass']), $link);
  3. $selection = "SELECT userid, username,... FROM user WHERE login = '$login' AND pass = '$pass'";


 
Une fois le résultat obtenu, vérifier que la requête sql n'a renvoyé qu'un seul résultat.

Message cité 1 fois
Message édité par rufo le 13-02-2007 à 09:42:26
Reply

Marsh Posté le 12-02-2007 à 15:25:37    

drexlbob a écrit :

Ok, c'est cool. Ca fait un bout de temps que je cherche, Une erreur bete encore.
Maintenant imaginons qu'a la place de 'dilob' et 'asd' jai $login_in_db et $pass_in_db et que ensuite je les comparent a un formulaire(champs login + champs mot de passe) rempli par l'utilisateur.
Lorsque je met les variable ca ne marche pas.En faite je ne voit pas trop comment faire pour comparer ce que saisi l'utilisateur par rapport au contenu de la base de donnee.
Pourrai tu me dire comment faire ca srrai vraiment sympa de ta part
 
 
je fait un truk du genre :
$login = $_POST['login'];  
$pass = $_POST['pass'];
 
if(pass_in_db == $pass && login_in_db == $login)
echo "Authentification reussie";
else
echo "Auth echouee";


 
C'est pas comme si on te l'avait fait remarquer il y a 3 jours et même expliqué comment les eviter en affichant les notices  :sarcastic:


Message édité par math2k le 12-02-2007 à 18:53:59
Reply

Marsh Posté le 12-02-2007 à 18:51:12    

rufo a écrit :

après, faut gérer le pb du sql injection


Ce serait peut-être une bonne idée oui, et vu le niveau de la personne je doute qu'elle comprenne le sens de l'expression et qu'elle recherche ce que ça signifie, prière donc d'éditer ton post en le réécrivant correctement stpmerssi


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 09:43:15    

masklinn a écrit :

Ce serait peut-être une bonne idée oui, et vu le niveau de la personne je doute qu'elle comprenne le sens de l'expression et qu'elle recherche ce que ça signifie, prière donc d'éditer ton post en le réécrivant correctement stpmerssi


 
ça te va? :)
 
Bon, perso, pour éviter ce genre de pb, côté client, je hashe en md5 le login et le mdp. Comme ça, côté serveur, j'attends 2 variables de 32 caractères qui ne risquent pas de contenir de ', # ou autre joyeuseté et contourner mon système d'authentification...

Message cité 1 fois
Message édité par rufo le 13-02-2007 à 09:49:18
Reply

Marsh Posté le 13-02-2007 à 10:42:35    

rufo a écrit :

ça te va? :)


Non.
 
1. stripslashes ne doit être utilisé que si magic_quotes_gpc est actif
2. J'aime pas l'intégration de valeurs comme ça dans les requêtes de DB, il n'est pas assez flagrant qu'on importe une valeur externe
3. Et tu devrais préciser que sous PHP5 on ne fait pas ce genre de merdes et on utilise mysqli ou PDO (qui sont nécessaires pour accéder correctement à MySQL >= 4.1 de toute façon)

rufo a écrit :

Bon, perso, pour éviter ce genre de pb, côté client, je hashe en md5 le login et le mdp.


Et si le client n'a pas de javascript? :whistle:  

rufo a écrit :

Comme ça, côté serveur, j'attends 2 variables de 32 caractères qui ne risquent pas de contenir de ', # ou autre joyeuseté et contourner mon système d'authentification...


Donne moi l'URL d'une page où tu fais ça, et je te montre que je peux te balancer autant de ', " et # que je veux :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 10:42:35   

Reply

Marsh Posté le 13-02-2007 à 11:19:53    

masklinn a écrit :

Non.
 
1. stripslashes ne doit être utilisé que si magic_quotes_gpc est actif
2. J'aime pas l'intégration de valeurs comme ça dans les requêtes de DB, il n'est pas assez flagrant qu'on importe une valeur externe
3. Et tu devrais préciser que sous PHP5 on ne fait pas ce genre de merdes et on utilise mysqli ou PDO (qui sont nécessaires pour accéder correctement à MySQL >= 4.1 de toute façon)
 
Et si le client n'a pas de javascript? :whistle:  
 
Donne moi l'URL d'une page où tu fais ça, et je te montre que je peux te balancer autant de ', " et # que je veux :o


ben ce sont des intranets. Donc pas accessible depuis l'extérieur.
Le coup du Javascript pas activté, je l'attendais celle là. Avec du md5, faudra que tu m'expliques comment tu mets le caractère # ou ' ou "...
 
Pour info, j'ai testé un certain nb d'ex d'injection extrait de ce site : http://www.phpsecure.info/v2/article/InjSql.php
J'ai pas de pb pour 4 raisons :
1) comme dit précédemment, le md5 ne contient pas de # ' "
2) j'attends 32 caractères pour chaque champ (login et mdp)
3) comme j'ai besoin d'un certain nb d'autres infos sur l'utilisateur (pour les stocker dans la session), je fais des jointures sur d'autres tables. Donc, en général elles vont échouer car j'aurai une réponse vide. Et je mets les conditions sur le login/mdp en fin de requête.
4) si tout s'est bien passé avant, je dois avoir au max, 1 réponse (utilisateur trouvé dans la bd), sinon 0.
 
Et pour ce qui est de mysqli ou PDO, je pense pas queça soit utile dès le départ de l'embrouiller avec ça.
 
sinon, pour php4, voici une petite fonction pour sécuriser trouvée sur http://www.netlobo.com/preventing_mysql_injection.html
 

Code :
  1. <?php
  2. // Quote variable to make safe
  3. function quote_smart($value)
  4. {
  5.     // Stripslashes
  6.     if (get_magic_quotes_gpc()) {
  7.         $value = stripslashes($value);
  8.     }
  9.     // Quote if not integer
  10.     if (!is_numeric($value)) {
  11.         $value = "'" . mysql_real_escape_string($value) . "'";
  12.     }
  13.     return $value;
  14. }
  15. ?>


Reply

Marsh Posté le 13-02-2007 à 11:39:46    

rufo a écrit :

Le coup du Javascript pas activté, je l'attendais celle là.


Tant mieux [:spamafote]

 

Ce qui n'enlève rien à la validité de l'argument

rufo a écrit :

Avec du md5, faudra que tu m'expliques comment tu mets le caractère # ou ' ou "...


Tu valides que ce qui arrives à ton serveur ressemble bien à du MD5 avant de l'utiliser? [:itm]

rufo a écrit :

Et pour ce qui est de mysqli ou PDO, je pense pas queça soit utile dès le départ de l'embrouiller avec ça.


Embrouiller? [:mlc]

 

C'est simplissime et ça permet d'éviter 95% des injections SQL si on l'utilise correctement [:pingouino]

Message cité 1 fois
Message édité par masklinn le 13-02-2007 à 11:40:16

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 11:54:58    

masklinn a écrit :

Tant mieux [:spamafote]  
 
Ce qui n'enlève rien à la validité de l'argument
 
Tu valides que ce qui arrives à ton serveur ressemble bien à du MD5 avant de l'utiliser? [:itm]
 
Embrouiller? [:mlc]
 
C'est simplissime et ça permet d'éviter 95% des injections SQL si on l'utilise correctement [:pingouino]


 
Je vérifie juste si ça fait bien 32 caractères il est vrai. Pourquoi ce "laxisme"? Parce que mon appli se trouve dans un environnement déjà relativement bien sécurisé, coupé de l'extérieur et qu'il est facile en cas d'attaque d'un petit malin de remonter à lui.
Maintenant, je sais que mon système n'est pas infaillible. Mais suffit juste de vérifier que mes 2 chaînes reçues font bien 32 caractères et ne contiennent que 0..9 et a..f. Et là, je pense qu'on est pénard.

Reply

Marsh Posté le 13-02-2007 à 12:09:37    

rufo a écrit :

suffit juste de vérifier que mes 2 chaînes reçues font bien 32 caractères et ne contiennent que 0..9 et a..f. Et là, je pense qu'on est pénard.


Là oui, mais il faut le faire, et il ne faut impérativement que l'utilisateur ait un support JS et le JS activé [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 12:45:38    

masklinn a écrit :

Là oui, mais il faut le faire, et il ne faut impérativement que l'utilisateur ait un support JS et le JS activé [:spamafote]


 
ce qui est le cas sur le web dans une large majorité et, là où je travaille, toujours le cas, donc pas de pb ;)

Reply

Marsh Posté le 13-02-2007 à 14:27:54    

rufo a écrit :

ce qui est le cas sur le web dans une large majorité et, là où je travaille, toujours le cas, donc pas de pb ;)


Ca, c'est typiquement le genre de trucs dont tu ne peux absolument pas être certain


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 14:53:46    

là où je travaille, si...
 
Mais bon, on va pas épiloguer. Le gars voulait une réponse à son pb, il l'a eue. Je pense pas qu'on va lui prendre la tête pour savoir si le MCD de sa base est correct, s'il développe bien son appli avec une architecture MVC, s'il respecte bien toutes les recommandations du w3c et nianiani et nianiana  :na:  
 
Je pense qu'il débute; il va donc commencer par faire des choses simples et si ça lui plaît et l'intéresse, il apprendra "les bonnes manières" au fur et à mesure ;)

Message cité 1 fois
Message édité par rufo le 13-02-2007 à 14:58:24
Reply

Marsh Posté le 13-02-2007 à 15:07:39    

rufo a écrit :

il apprendra "les bonnes manières" au fur et à mesure ;)


lol...
(et en codant en PHP en plus, rien que ça)


Message édité par masklinn le 13-02-2007 à 15:07:57

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 16:07:28    

mais de toute façon, si le magic_quotes_gpc est à ON sur le server, on s'en bat les cacahuètes nan?  :??:  
du coup si on les insère "en dur", sans htmlentities&co, dans la req SQL, ça craint pas. si?


---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 16:30:29    

BobbyLeZob a écrit :

mais de toute façon, si le magic_quotes_gpc est à ON sur le server, on s'en bat les cacahuètes nan?  :??:


Non, magic_quotes n'est pas une fonctionalité de sécurité c'est un trou de sécurité, l'encodage est trop générique et complètement incorrect, raison pour laquelle il ne faut surtout pas utiliser `addslashes` (qui fait exactement ce que fait magic_quotes).

 

En bonus, ça flinque les perfs (il faut escaper tout ce qui entre) et ça force à manuellement dé-escaper tout ce qui ne va pas dans la DB, créant non seulement un code illisible mais fusillant encore plus les perfs (puisqu'il faut appeler stripslashes sur tout ce qui rentre).

 

C'est pourquoi magic_quotes est désactivé par défaut dans PHP5 et a été totalement supprimé dans PHP6 (normalement)

 

Pour plus d'infos sur le sujet et les problèmes de sécurité liés à php, ce post fournit une liste.


Message édité par masklinn le 13-02-2007 à 16:31:50

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 17:03:07    

[:darkmavis xp]
ah quand même.  [:gaxx]

 

J'ai du mal:
L'exemple que donne le mec, c'est avec le magic_quotes_gpc @ ON?

 

on peut bypasser le addslashes alors? mais comment?

 

le code ci-dessous sert à quoi en fait?


$_POST['username'] = chr(0xbf) .
                     chr(0x27) .
                     ' OR username = username /*';

 

ça ressemble bien à une injection SQL mais je ne comprends pas l'utilité des chr() et ce que ça retourne.
tu voudrais bien expliciter Masklinn?

 


Mes scripts sont potentiellement vulnérables donc.  [:million dollar baby]

 


ça ne vous effraie pas vous, qu'on puisse kicker magic_quotes_gpc dans les versions ultérieures?  [:mullet]

Message cité 1 fois
Message édité par BobbyLeZob le 13-02-2007 à 17:07:09

---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 17:34:11    

BobbyLeZob a écrit :

[:darkmavis xp]
ah quand même.  [:gaxx]

 

J'ai du mal:
L'exemple que donne le mec, c'est avec le magic_quotes_gpc @ ON?


L'exemple que donne le mec est avec addslashes et sans magic_quotes, mais magic_quotes est strictement équivalent à utiliser addslashes sur toutes les valeurs de $_GET, $_POST et quelques autres ($_REQUEST aussi il me semble), donc la vulnérabilité potentielle est identique.

BobbyLeZob a écrit :

on peut bypasser le addslashes alors? mais comment?


C'est marqué suffit de lire :o

 

En gros il faut utiliser des caractères multibytes invalides créant un caractères multibyte valide + le caractère 0x27 (la quote) quand on y insère un antislash.

 

Genre 0xbf27 (la valeur hexadécimale 27, correspondant à ' quand elle est utilisée seule): addslashes ne comprend pas les charsets multibytes, donc il tente d'échapper 0x27 ( ' ) en le préfixant par 0x5c (qui correspond au caractère \ ). Le résultat, c'est que le flux se retrouve avec 0xbf27 remplacé par 0xbf5c27. 0xfb5c étant un caractère multibyte valide dans l'encodage que l'auteur a choisi, on se retrouve donc avec un caractère 0xbf5c et un caractère 0x27... soit une quote seule... boum

BobbyLeZob a écrit :


le code ci-dessous sert à quoi en fait?


$_POST['username'] = chr(0xbf) .
                     chr(0x27) .
                     ' OR username = username /*';

 

ça ressemble bien à une injection SQL mais je ne comprends pas l'utilité des chr() et ce que ça retourne.


chr retourne le caractère dont on donne le code, donc ici il retourne un caractère de code 0xbf et un caractère de code 0x27, soit la séquence dont je parlais au dessus, qui va se faire échapper partiellement (mais abusivement) et va donc placer une quote ( ' ) littérale dans la chaîne de caractères

 
BobbyLeZob a écrit :

Mes scripts sont potentiellement vulnérables donc.  [:million dollar baby]


Si tu utilises addslashes ou magic_quotes dans tes scripts oui, si tu utilises mysql_real_escape_string ou les Bound parameters de PDO ou mysqli non.

 

Si tu es dans le premier cas, passe vite dans le second, c'est un conseil.

BobbyLeZob a écrit :

ça ne vous effraie pas vous, qu'on puisse kicker magic_quotes_gpc dans les versions ultérieures?  [:mullet]


Je ne comprends pas trop la question, demandes tu si ça nous fait peur que magic_quotes disparaisse (soit retiré) de PHP6? Si c'est le cas, absolument pas: comme le montre le lien que j'ai donné addslashes et magic_quotes ne sont pas des sécurités suffisantes, et sont donc des dangers.

Message cité 1 fois
Message édité par masklinn le 13-02-2007 à 17:37:16

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 18:18:05    

masklinn a écrit :

0xfb5c étant un caractère multibyte valide dans l'encodage que l'auteur a choisi, on se retrouve donc avec un caractère 0xbf5c et un caractère 0x27... soit une quote seule... boum


 
 [:totoz]  
 
Le problème en fait, c'est qu'au lieu de lire 0xbf, 0x5c et 0x27 -dans lequel cas le 0x27 est correctement échappé- le serveur lit en réalité 0xbf5c et 0x27 ?  :??:  
0xbf5c correspond à quel char?
 
Et en pratique, il faudrait saisir quoi dans un form avec deux input (login et pwd) pour exploiter la "faille" ?  [:million dollar baby]  
 
genre si je rentre mot pour mot dans le champ de saisi du login ceci:


chr(0xbf).chr(0x27) OR 3=3 --


ça ne fonctionnera jamais.  :lol:  
 
ou ptet en passant par une modification des headers.  :??:
 

masklinn a écrit :


Si tu es dans le premier cas, passe vite dans le second, c'est un conseil.


j'y compte bien.  :D  
merci
 

masklinn a écrit :


Je ne comprends pas trop la question, demandes tu si ça nous fait peur que magic_quotes disparaisse (soit retiré) de PHP6? Si c'est le cas, absolument pas: comme le montre le lien que j'ai donné addslashes et magic_quotes ne sont pas des sécurités suffisantes, et sont donc des dangers.


c'est ce que j'évoquais.  :jap:  

Message cité 1 fois
Message édité par BobbyLeZob le 13-02-2007 à 18:21:04

---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 18:33:47    

BobbyLeZob a écrit :

Le problème en fait, c'est qu'au lieu de lire 0xbf, 0x5c et 0x27 -dans lequel cas le 0x27 est correctement échappé- le serveur lit en réalité 0xbf5c et 0x27 ?  :??:


Non, le serveur lit correctement 0xbf5c (qui est un caractère GBK valide) et 0x27 (un autre caractère GBK valide), le problème vient d'addslashes qui ne se rend pas compte que 0xbf27 devrait être considéré comme un caractère... parce qu'il ne comprend pas les encodages.

BobbyLeZob a écrit :

0xbf5c correspond à quel char?


http://www.fileformat.info/info/unicode/char/7e17/sample.png
縗 -- correspond au codepoint unicode U+7E17

BobbyLeZob a écrit :

Et en pratique, il faudrait saisir quoi dans un form avec deux input (login et pwd) pour exploiter la "faille" ?  [:million dollar baby]


Aucune idée, mais en pratique quand on tente de trouver des failles on n'utilise pas les formulaires des pages, donc ce n'est pas un problème ;)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 18:50:42    

masklinn a écrit :

Non, le serveur lit correctement 0xbf5c (qui est un caractère GBK valide) et 0x27 (un autre caractère GBK valide), le problème vient d'addslashes qui ne se rend pas compte que 0xbf27 devrait être considéré comme un caractère... parce qu'il ne comprend pas les encodages.


Attends, je suis perdu:
1.le serveur reçoit 0xbf27
2.il se dit:
- "hola! j'ai comme l'impression qu'il y a deux chars ici : 0xbf et 0x27, héhé" [:dawa]
3.
- "donc j'escape 0x27 par prudence avec mon 0x5c"  [:bobbylezob]  
4.
- "tiens, ça donne 0xbf5c, mais j'ai pas l'impression qu'il y a deux chars cette fois-ci"  [:million dollar baby]  
5.
- "voilà j'ai terminé mon traitement, j'envoie mon rapport au visiteur : 0xbf5c et 0x27. hop c'est parti!"  [:__canard__]  
6.
- "eÿ, minute! j'me suis planté! j'ai envoyé un 0x27 sans l'échapper du coup, dans le lot; alors que j'aurai du envoyer 0xbf + 0x5c + 0x27 ... fais chier il va se faire hacker"  [:klemton]  
 
 
c'est juste?  [:cupra]  
[/quotemsg]
 
 

masklinn a écrit :


Aucune idée, mais en pratique quand on tente de trouver des failles on n'utilise pas les formulaires des pages, donc ce n'est pas un problème ;)


ah bah si le problème ne se pose pas moi je laisse mes addslashes.  [:thalis]  
 [:cosmoschtroumpf]

Message cité 1 fois
Message édité par BobbyLeZob le 13-02-2007 à 18:52:30

---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 19:04:59    

BobbyLeZob a écrit :

Attends, je suis perdu:
1.le serveur reçoit 0xbf27
2.il se dit:
- "hola! j'ai comme l'impression qu'il y a deux chars ici : 0xbf et 0x27, héhé" [:dawa]
3.
- "donc j'escape 0x27 par prudence avec mon 0x5c"  [:bobbylezob]  
4.
- "tiens, ça donne 0xbf5c, mais j'ai pas l'impression qu'il y a deux chars cette fois-ci"  [:million dollar baby]  
5.
- "voilà j'ai terminé mon traitement, j'envoie mon rapport au visiteur : 0xbf5c et 0x27. hop c'est parti!"  [:__canard__]  
6.
- "eÿ, minute! j'me suis planté! j'ai envoyé un 0x27 sans l'échapper du coup, dans le lot; alors que j'aurai du envoyer 0xbf + 0x5c + 0x27 ... fais chier il va se faire hacker"  [:klemton]  
 
 
c'est juste?  [:cupra]  


Non, c'est n'importe quoi.
 
1. PHP reçoit les octets 0xbf27 qu'il interprète comme partie d'une chaîne de caractères, PHP sait que sa chaîne est encodée en CJK et que 0xbf27 correspond à un caractère unique
2. Il est demandé au serveur d'addslasher la chaîne de caractères (via magic_quotes ou via addslashes), donc PHP appelle `addslashes` en lui filant la chaîne de caractère
3. addslashes, lui, ne connaît pas le CJK. En fait il n'a aucune notion d'encoding et ne se pose pas la question. En arrivant à 0xbf27, addslashes est donc incapable de déterminer que c'est un caractère unique, il "comprend" donc ces deux octets comme les deux caractères 0xbf et 0x27.
4. 0x27 correspond à une quote ( ' ), donc addslashes le remplace par 0x5c27, ou la paire de caractères \'
5. addslashes renvoie son résultat au reste du script PHP
6. PHP considère toujours que sa chaîne est en CJK (et dit à MySQL que la chaîne est en CJK). En lisant la chaîne en tant que chaîne CJK, PHP et MySQL voient donc maintenant deux caractères CJK: 0xbf5c (縗;) et 0x27 (')
7. Boum
 

BobbyLeZob a écrit :

ah bah si le problème ne se pose pas moi je laisse mes addslashes.  [:thalis]  
 [:cosmoschtroumpf]


J'ai du mal à déterminer si

  • Tu n'as pas lu ce que j'ai écrit
  • Tu n'as pas compris ce que j'ai écrit
  • Tu te fous de moi


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 19:13:20    

masklinn a écrit :

Non, c'est n'importe quoi.


 [:blessure]  
 

masklinn a écrit :


1. PHP reçoit les octets 0xbf27 [...]
7. Boum


ok, j'y suis. avoue que j'étais pas loin quand même. j'avais pas compris l'enjeu de l'encodage/charset.  [:thalis]  
 

masklinn a écrit :


J'ai du mal à déterminer si

  • Tu n'as pas lu ce que j'ai écrit
  • Tu n'as pas compris ce que j'ai écrit
  • Tu te fous de moi

J'ai lu et je ne me permettrai pas de me payer la gueule de qqn qui veut bien m'accorder de son temps pour m'expliquer.  :hello:  
 
merci, donc.


---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 21:32:11    

BobbyLeZob a écrit :

J'ai lu et je ne me permettrai pas de me payer la gueule de qqn qui veut bien m'accorder de son temps pour m'expliquer.  :hello:  
 
merci, donc.


Bon, alors pour faire simple ton serveur reçoit des requêtes HTTP, un navigateur n'est rien de plus qu'un client HTTP qui est capable d'interpréter des réponse HTML (et autres) en tant que pages web. Fondamentalement, à partir du moment où on sait quelles données HTTP tu récupères (user/pass, les noms des champs et l'url à laquelle il faut l'envoyer) il n'y a plus besoin de passer par un navigateur: on peut passer par des outils spécialisés comme cUrl ou par les librairies HTTP d'un language qu'on connait comme urllib en Python (la liste de classe devrait te donner une idée de la flexibilité de ce genre d'outils), Net::HTTP et OpenURI en Ruby, HTTPClient en Java ou même curl ou HttpClient en PHP.
 
Aucun besoin, donc, d'utiliser le formulaire sur ta page pour t'envoyer des données.
 
Et donc aucune raison de se limiter à ce qu'il est possible d'écrire dans le dit formulaire, il est possible de t'envoyer littéralement tout et n'importe quoi.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 22:00:27    

ok, c'est le addslashes() que je captais pas, je ne m'attendais pas à ce que tu me parle du formulaire.  :D  
Pour ce qui concerne les données transmises, oui, je suis d'accord, il n'est pas necessaire de passer par le form du site qui présente la "faille", on peut se débrouiller avec CURL ou coder son petit bot qui enverra les headers, en POST, qui vont bien. Ou, plus simple, il suffit d'éditer la page du site (donc le form) en local pour envoyer ce qu'on veut...
enfin...
 :hello:


---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 22:04:48    

BobbyLeZob a écrit :

ok, c'est le addslashes() que je captais pas, je ne m'attendais pas à ce que tu me parle du formulaire.  :D  
Pour ce qui concerne les données transmises, oui, je suis d'accord, il n'est pas necessaire de passer par le form du site qui présente la "faille", on peut se débrouiller avec CURL ou coder son petit bot qui enverra les headers, en POST, qui vont bien. Ou, plus simple, il suffit d'éditer la page du site (donc le form) en local pour envoyer ce qu'on veut...
enfin...
 :hello:


Oui mais là le principe c'est de pouvoir envoyer les données textuelles amenant à la faille, donc sans être limité parce qu'on peut inscrire avec son clavier ;)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 22:17:13    

voilà, exactement. c'est le "problème".
Si on veut exploiter la faille, en l'envoyant sous forme de texte, usuellement, c'est impossible.
Il faudrait pouvoir modifier le "flux" qui est envoyé au site ciblé.
exemple:
si on suppose que ce flux est:
 
0x&éé"é"tié"y&ié"y&ézqs_fdvxçg_dsç_fàç"_'&_é"'çé"'àçé"'ç_è_èç_èvxcvxcBLABLABLABLAB
 
 
il faudrait pouvoir le transformer en qqchose comme:
 
0x&éé"é"tié"y&ié"y&ézqs_fdvxçg_dsç_fàç"_'&_bf27é"'çé"'àçé"'ç_è_èç_èvxcvxcBLABLABLABLAB  
 
pour pouvoir pirater le site ciblé.
 
 
Mais bon, là c'est un exemple, je raconte de la merde, ça dépasse mes compétences, je sais pas comment ça se passe moi "derrière" le processus de http headers...
 
Je sais pas si je me fais comprendre d'ailleurs...  [:million dollar baby]
 
 
 
Et je suis sûr que tu as une idée du comment on peut se débrouiller pour faire avaler ce 0xbf27 dans la req SQL.  [:rhetorie du chaos]  


---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 22:22:21    

C'est ce que je suis en train d'essayer de t'expliquer: les libs HTTP que j'ai cité plus haut permettent d'envoyer des données arbitraires aux serveurs [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-02-2007 à 23:00:31    

lapin comprite, pancake sur la tête, toussaaa... [:spamafote]
Tu entends quoi par données arbitraires?
Tu voudrais pas être plus explicite et/ou donner un exemple concret, un bout de code, qui montrerai en quoi cette faille est exploitable?
(On passe en MP si  tu veux...)
 
désolé si je suis lent, je code uniquement à mes heures perdues, en amateur, donc mes compétences sont bornées.  :D


---------------
BLZ n'est plus
Reply

Marsh Posté le 13-02-2007 à 23:51:02    

BobbyLeZob a écrit :

lapin comprite, pancake sur la tête, toussaaa... [:spamafote]
Tu entends quoi par données arbitraires?


Ben par "données arbitraires" j'entend "tout et n'importe quoi"

BobbyLeZob a écrit :

Tu voudrais pas être plus explicite et/ou donner un exemple concret, un bout de code, qui montrerai en quoi cette faille est exploitable?


Demain si j'ai le temps, histoire de ne pas donner un code test qui ne fonctionne pas (j'ai ni PHP ni MySQL sur ma machine actuelle)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-02-2007 à 00:00:08    

:)


---------------
BLZ n'est plus
Reply

Marsh Posté le 15-02-2007 à 12:45:40    

[:thalis]


---------------
BLZ n'est plus
Reply

Marsh Posté le 15-02-2007 à 16:33:44    

masklinn a écrit :


Demain si j'ai le temps, histoire de ne pas donner un code test qui ne fonctionne pas (j'ai ni PHP ni MySQL sur ma machine actuelle)


 
 
 [:cannabix]  


---------------
BLZ n'est plus
Reply

Marsh Posté le 16-02-2007 à 21:43:26    

[:kahn21]


---------------
BLZ n'est plus
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed