NewbieContest

Programmation => Langages Web => Discussion démarrée par: nofx le 15 Mars 2007 à 09:12:31



Titre: [PHP]script injection sql
Posté par: nofx le 15 Mars 2007 à 09:12:31
bonjour à tous,

je me suis fait un petit script pour voir l effet des injections sql mais cela ne fonctionne pas pourtant mon script et des plus basic sans aucunes protections!

Code:
$pseudo = $_POST['pseudo'];
$passe = $_POST['passe'];
$requete=mysql_query("SELECT * FROM admin WHERE pseudo='$pseudo' AND passe='$passe'") OR die(mysql_error());
if(mysql_num_rows($requete)!==0)
{
echo "bienvenue";
}
else
{
echo "perdu";
}
voila en fait je perd tout le temps :cry:! si quelqu'un peut il me dire pourquoi? merci d avance


Titre: [PHP]script injection sql
Posté par: zours le 15 Mars 2007 à 10:54:29
Pour moi il est parfaitement injectable ce script. Ca pourrait être une bonne idée que tu nous donnes des exemples de ce que tu as tenté, qu'on te dise ce que tu fais mal :) (non, je ne donne pas d'exemple d'injection tout de suite, c'est volontaire).


Titre: [PHP]script injection sql
Posté par: nofx le 15 Mars 2007 à 11:05:35
Ben il me parrait tres mal proteger aussi :lol:

Voici quelques tentatives!

Donc dans pseudo:     jean'");\\

apres **orthographe !** tenter : jean' OR '1'='1'");\\

jean'");#

OR 1=1'");\\

Ce sont les tentives que je trouvais les plus propables


Titre: [PHP]script injection sql
Posté par: Zmx le 15 Mars 2007 à 11:33:35
magic_quote ?


Titre: [PHP]script injection sql
Posté par: nofx le 15 Mars 2007 à 11:41:39
ah jsai pas si les magics quotes sont activées par défaut avec wamp!
Ou dois-je regarder pour voir si elles sont activées?
merci



J ai trouve merci mais maintenant je n ai plu qu'à trouver la bonne syntaxe car pour le moment j ai ca comme reponse

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '");#' AND passe=''' at line 1


Titre: [PHP]script injection sql
Posté par: nofx le 15 Mars 2007 à 15:52:17
Merci je viens de découvrir l'éfficacité des magic_quote et j ai reussis quelques injections..
Maintenant j essaie dautre injections avec un autre script genre id=1'...
merci quand meme


Titre: [PHP]script injection sql
Posté par: Gardel le 15 Mars 2007 à 16:12:40
Ton code est bizarrement fait, ça fonctionne avec des variables entre ' ' ? :s Ca doit être pris pour des chaines de caracteres... donc ce serait toujours faut.
De plus, tu devrais inverser Perdu et Bienvenue car c'est si la requete te retourne 1 enregistrement que c'est binvenue.

Essaye plutot avec ça :

Code:
$requete = mysql_query('SELECT * FROM admin WHERE pseudo = '.$_POST['pseudo'].' AND pass = '.$_POST['pass']) OR die(mysql_error());
if(!mysql_num_rows($requete))
    echo 'Perdu';
else
    echo 'Bienvenue';


Titre: [PHP]script injection sql
Posté par: Zmx le 15 Mars 2007 à 17:04:21
Citation de: Gardel
Ca doit être pris pour des chaines de caracteres...
Euh ... c'est le but que le contenu de la variable soit prit comme une chaine de caractere (ou alors j'ai rien compris a ta remarque)

Au final on veux SELECT * FROM ADMIN WHERE pseudo='<maChaine>' , non ?


Titre: [PHP]script injection sql
Posté par: Gardel le 15 Mars 2007 à 17:40:37
Ce qu'on veut rechercher dans la requête, c'est la valeur de la variable $pseudo et non la chaine de caractères '$pseudo'

Ce qui est mis entre single quotes n'est pas interprêté non ?


Titre: [PHP]script injection sql
Posté par: Zmx le 16 Mars 2007 à 08:59:08
ah j'ai compris ta remarque.
Je prend 20 sec pour tester.

Code:
<?
$test = 'toto';
echo " test $test\n";
echo 'test $test\n';
?>
Le code suivant a la sorti suivante:
Code:
(zmx@localhost)[~]-% php test.php 
 test toto
test $test\n
A prioris ça marche comme le perl.
avec des "" les variable et caractere d'escape sont prit en compte, avec les '' on a ce qu'on mets dedans (ni var, ni escape.)
Donc "SELECT * FROM admin WHERE pseudo='$pseudo' AND passe='$passe'" est correct.


Titre: [PHP]script injection sql
Posté par: nofx le 16 Mars 2007 à 13:26:31
salut,
ca
SELECT * FROM admin WHERE pseudo='$pseudo' AND passe='$passe'
et
ca
SELECT * FROM admin WHERE pseudo='".$pseudo."' AND passe='".$pseudo."'


ca fait la meme chose apres je sais pas si au niveau de la syntaxe laquelle et la plus correcte.

Sinon c'etait bien les magics_quotes qui etaient activées.
le script fonctionne bien.


Titre: [PHP]script injection sql
Posté par: zours le 16 Mars 2007 à 14:44:30
Citation de: Gardel
Ce qu'on veut rechercher dans la requête, c'est la valeur de la variable $pseudo et non la chaine de caractères '$pseudo'

Ce qui est mis entre single quotes n'est pas interprêté non ?
Nawak.
Code:
'$machin' <--- Pas interprété.
"'$machin'" <--- Interprété.
Pour donner quand même un peu plus d'infos : c'est pas le fait que ça soit entre single quotes ou non qui fait que ça soit interprété, c'est le fait qu'elles soient ou non les délimiteurs de chaîne. Si tu prends des double quotes comme délimiteur, les single quotes que tu pourrais mettre dedans sont vues comme des caractères normaux. Donc pas de raison que la variable ne soit pas interprétée.


Titre: [PHP]script injection sql
Posté par: Gardel le 16 Mars 2007 à 14:59:03
Ah ouai ok je voyais pas ça comme ça.
'fin bon vaut mieux de toute façon prendre l'habitude de concaténer, au moins on est sûr de ce qu'on fait et surtout c'est plus rapide à l'exécution (ok ici pas besoin de rapidité mais bon :p)


Titre: [PHP]script injection sql
Posté par: zours le 16 Mars 2007 à 17:11:21
Nan. J'avais vu des benches à ce sujet, je posterai le lien si je le retrouve. Le plus rapide, c'est avec les ob_start() et compagnie :).


Titre: [PHP]script injection sql
Posté par: Ge0 le 14 Avril 2007 à 13:12:10
Bon, je survole le topic vite fait.

Nofx, pour ton code du début, si tu veux te tester aux injections SQL, tu n'as deux solutions pour que ça passe :
- Tu trouves php.ini, tu recherches cette ligne :
Code:
magic_quotes = On
Tu remplaces On par Off

- Tu utilises stripslashes(), qui enlève les antislashs à tes variables...

Désolé si cela à été énoncé plus tôt ^^

Edit : si je reprends ton code du début, ça doit te faire ça (avec les stripslashes() )

Code:
$pseudo = stripslashes($_POST['pseudo']);
$passe = strispslashes($_POST['passe']);
$requete=mysql_query("SELECT * FROM admin WHERE pseudo='$pseudo' AND passe='$passe'") OR die(mysql_error());
if(mysql_num_rows($requete)!==0)
    {
    echo "bienvenue";
    }
    else
    {
    echo "perdu";
    }


Titre: [PHP]script injection sql
Posté par: darkfig le 14 Avril 2007 à 15:36:02
Citation de: Geo
Bon, je survole le topic vite fait.

Nofx, pour ton code du début, si tu veux te tester aux injections SQL, tu n'as deux solutions pour que ça passe :
Il y en a plus de deux, si le script n'a pas de quotes (par exemple, où si il utilise le tableau $_SERVER dans une requete SQL) pas besoin de mettre la directive magic_quotes_gpc sur Off ;)

Citation
- Tu trouves php.ini, tu recherches cette ligne :
Code:
magic_quotes = On
Tu remplaces On par Off
Je connais pas cette directive, a ouai tu t'es trompé ;) C'est magic_quotes_gpc.


Titre: [PHP]script injection sql
Posté par: Ge0 le 14 Avril 2007 à 15:42:56
Ouais t'as raison je me suis trompé, je vais trop vite.
Et oui, Magic_quotes ne filtre que les tableaux $_GET, $_POST et $_COOKIE (je crois qu'ils le disent en commentaire dans php.ini), donc ils s'en fiche des variable $_SERVER