Faille dans script

Faille dans script - PHP - Programmation

Marsh Posté le 10-04-2005 à 17:27:14    

Bonjour je fait un script (de récupération de mot de pass perdu) dans le cadre de mon forum perso et je voudrai savoir si vou y voyez des failles de sécurité...
 
Le principe est simple un formulaire demande a la personne d entrer l adresse mail d inscription, ce formulaire envoie ensuite sur cette page... ( ou $email est la varibale issue du nom de formulaire dans lequel l utilisateur entre son adresse)
 

Code :
  1. <?
  2. $test=0;
  3. $email=str_replace("'", "", $email);
  4. $email=str_replace(";", "", $email);
  5. $email=str_replace('"', '', $email);
  6. $email=str_replace("$", "", $email);
  7. $email=str_replace("<", "", $email);
  8. $email=str_replace("\\", "", $email);
  9. $log_pass=file_get_contents('hrtb/gxsc/nfia.ext');
  10. $log_pass=unserialize($log_pass);
  11. mysql_connect($log_pass["domain"], $log_pass["pseudo"], $log_pass["pass"]);
  12. $base= mysql_select_db($log_pass["pseudo"]);
  13. $passv=$log_pass["base"];
  14. if (!$base)
  15. {
  16. echo "impossible d'ouvrir la base !";
  17. }
  18.    $req = "SELECT pass, pseudo FROM $passv";
  19.    $req .= " WHERE email = '" .$email . "'";
  20.    $result = mysql_query($req);
  21.    $test= mysql_num_rows($result);
  22.    list($pass, $pseudo) = mysql_fetch_array($result);
  23. mysql_close();
  24. if ($test!=0)
  25. {
  26. $adressse=$email;
  27. $titre="Mot de pass";
  28. $message="Voici ton mot de pass pour le forum D-Versi0n : ".$pass."\n\nPour te logger clique ici : http://nitroseb.free.fr/GoGoL2/for [...] 34;.$pass;
  29. mail($adressse, $titre, $message,
  30.      "From: canvas@oreka.com\r\n"
  31.     ."Reply-To: canvas@oreka.com\r\n"
  32.     ."X-Mailer: PHP/" . phpversion());
  33. echo '<div align="center"><br><br><b>Un mail vous a été envoyé à l\'adresse mail spécifiée</b><br><br><a href="index.php">retour</a></div>';
  34. }
  35. else
  36. {
  37. echo '<div align="center"><br><br><b>Votre mail n\'est pas enregistré dans la base.</b><br><br><a href="javascript:history.back();">re-essayer</a></div>';
  38. }
  39. ?>


 
Merci pour votre réflexion... :)


Message édité par shrito le 10-04-2005 à 17:28:40
Reply

Marsh Posté le 10-04-2005 à 17:27:14   

Reply

Marsh Posté le 10-04-2005 à 17:34:27    

bon, je suis surement pas une reference en PHP mais si j'ai bien compris et interprete tes str_replace, il serai preferable de faire un htmlentities sur $mail.  :??:  
ou alors peut-être une bête de truc genre:
 

Code :
  1. if (eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$", $email))
  2. {
  3. // ton bazarre
  4.  }
  5. else{
  6.  echo "essai pas de me niqueyyy. :p";
  7.  }


comme ça il risque pas de mettre du code dans ton champ de saisie.  :)  
 
enfin je dis ça comme ça hein, moi aussi je débute.  :o
 
edit:
 
et là à mon avis faut faire un exit.

Code :
  1. if (!$base)
  2. {
  3. echo "impossible d'ouvrir la base !";
  4. exit;
  5. }


Message édité par pmusa le 10-04-2005 à 17:39:26
Reply

Marsh Posté le 10-04-2005 à 17:38:06    

et ta sérialisation de ton mot de passe c'est pas top !!
n'importe qui peut le récupérer et le desérialisé lui meme...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 10-04-2005 à 17:40:32    

KangOl a écrit :

et ta sérialisation de ton mot de passe c'est pas top !!
n'importe qui peut le récupérer et le desérialisé lui meme...


 :hello:  
ça veut dire quoi?
 
merci

Reply

Marsh Posté le 10-04-2005 à 17:42:08    

et faudrait peut etre mettre les register global a off...
 
http://nitroseb.free.fr/GoGoL2/for [...] eeeest.ext


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 10-04-2005 à 17:43:10    

pmusa a écrit :

:hello:  
ça veut dire quoi?
 
merci


Ca veut dire qu'on peut télécharger nfia.ext et le deserialiser sur sa propre machine.
 
 

pmusa a écrit :

bon, je suis surement pas une reference en PHP mais si j'ai bien compris et interprete tes str_replace, il serai preferable de faire un htmlentities sur $mail.  :??:  
ou alors peut-être une bête de truc genre:
 

Code :
  1. if (eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$", $email))
  2. {
  3. // ton bazarre
  4.  }
  5. else{
  6.  echo "essai pas de me niqueyyy. :p";
  7.  }


comme ça il risque pas de mettre du code dans ton champ de saisie.  :)  
 
enfin je dis ça comme ça hein, moi aussi je débute.  :o


Ou un bête addslashes, il restera compatible avec les ndd utf8 de l'avenir. :o


Message édité par kalex le 10-04-2005 à 17:44:32
Reply

Marsh Posté le 10-04-2005 à 17:43:13    

ui tu m explique commen faire pour récupérer mon mpd de BDD ???
 
Pour le ereg.. je suis d accord, j ai juste rajouté ca a l arrache ;)

Reply

Marsh Posté le 10-04-2005 à 17:47:35    

kalex a écrit :

Ca veut dire qu'on peut télécharger nfia.ext et le deserialiser sur sa propre machine.


can u repeeeeeat pleeeaaase??  :ouch:  :ouch:  
nfia.ext, c'est quoi, les extensions de la librairie?? ça se telecharge?  :sweat:  
 
 

kalex a écrit :


Ou un bête addslashes, il restera compatible avec les ndd utf8 de l'avenir. :o


pas la peine. la fin du monde est proche...  [:aloy]
 
edit:
 
c'est kouèèè register global??? c'est quand ça nous affiche les messages d'erreur.  :??:  
 
bah la preuve, le gars en connait la presence de ton fichier nfia.ext.  :D  
y'a des bêtes du PHP ici.  :sol:


Message édité par pmusa le 10-04-2005 à 17:51:03
Reply

Marsh Posté le 10-04-2005 à 17:49:06    

nfia.ext c'est le fichier dans lequel je met tout les info sur ma BDD SQL, pass etc... mais il est dans un repertoire protégé par htaccess donc... je vois pas comment on pourrait le récupérer....

Reply

Marsh Posté le 10-04-2005 à 17:50:26    

pmusa a écrit :

can u repeeeeeat pleeeaaase??  :ouch:  :ouch:  
nfia.ext, c'est quoi, les extensions de la librairie?? ça se telecharge?  :sweat:


Apparemment c'est le fichier serialisé dans lequel il stoque son mdp mysql...
 
edit : Si c'est récupérable avec des includes par ex : à ne pas faire !


Message édité par kalex le 10-04-2005 à 17:51:46
Reply

Marsh Posté le 10-04-2005 à 17:50:26   

Reply

Marsh Posté le 10-04-2005 à 17:55:27    

comment tu as su qu'il avais un fichier affublé de ce nom là dans son repertoire PROTEGE.  :pt1cable:  
les gars tu leur passe un bout de code, ils te cartographient tout ton site.  :lol:

Reply

Marsh Posté le 10-04-2005 à 17:57:40    

C'est écrit en toutes lettres à la 9eme ligne de son code. ;)

Reply

Marsh Posté le 10-04-2005 à 18:08:49    

effectivement.  :)  
question:
quand on fait un file_get_contents() et que le fichier cible est protégé par un .htaccess, il demande pas une identification le fichier appelant?  :ouch:  
je demande pour savoir, parce que sinon oui, avec un include c'est recuperable.  :??:  
 
je connaissait pas la fonction (un)serialize()  :??:  
c'est un truc comme base64_encode() ???

Reply

Marsh Posté le 10-04-2005 à 18:13:36    

pmusa a écrit :

effectivement.  :)  
question:
quand on fait un file_get_contents() et que le fichier cible est protégé par un .htaccess, il demande pas une identification le fichier appelant?  :ouch:  
je demande pour savoir, parce que sinon oui, avec un include c'est recuperable.  :??:  
 
je connaissait pas la fonction (un)serialize()  :??:  
c'est un truc comme base64_encode() ???


 
(un)serialize() ca sert a pouvoir stocker un tableau dans un fichier...
file_get_content passe a travers les htaccess mais je vois pas comment ton include pourra te permettre de récupérer le pass...

Reply

Marsh Posté le 10-04-2005 à 18:22:25    

Sur cette unique page peut-être.
Mais sur un site on a souvent plusieurs scripts installés (news, forum, blog, etc) et à la 1ere faille d'include dans l'un d'eux... Aïe. :/

Reply

Marsh Posté le 10-04-2005 à 18:23:45    

lol ce type de faille include... fo pas compter sur moi pour les laisser... ;)


Message édité par shrito le 10-04-2005 à 18:24:01
Reply

Marsh Posté le 10-04-2005 à 18:32:58    

- Si ton forum est destiné uniquement à ton site.
- Si tu installes aucun script tier sur le même compte.
- Si tu as confiance en toi.
Alors : d'accord. :D

Reply

Marsh Posté le 10-04-2005 à 18:35:27    

et comment s'en proteger de cette faille? j'utilise include(), j'ai pas envie que mes visiteurs l'exploitent à mauviais escient.  :D

Reply

Marsh Posté le 10-04-2005 à 18:38:19    

en gros... quand tu fais un include ne jamais faire:
 
include($variable) ou variable est définie par la page précédente, un formulaire ou autre... register global off peut permettre de s en protéger ;)
 
une solution existe pour utiliser un include aléatoire...
 
$var["page1"]=nom_page1.php;
$var["page2"]=nom_page2.php;
$var["page3"]=nom_page3.php;
$var["page4"]=nom_page4.php;
$var["page5"]=nom_page5.php;
 
tu crée un tableau avec les pages autorisée...
ensuite :
 
include ($var[$variable]);
 
comme ca le include pourra se faire que sur une page autorisé ;)


Message édité par shrito le 10-04-2005 à 18:40:35
Reply

Marsh Posté le 10-04-2005 à 18:39:49    

http://frederic.bouchery.free.fr/? [...] -Ou-Felure
 
Ou la version google cache, car free a encore l'air de déconner ( :fou: ) :
http://64.233.183.104/search?q=cac [...] -Ou-Felure


Message édité par kalex le 10-04-2005 à 18:40:12
Reply

Marsh Posté le 10-04-2005 à 19:09:53    

okey merci. ouais donc moi j'encours aucun problème avec mon code là:
 

Code :
  1. <?php
  2. if(isset($_GET['page']) && (file_exists('rep/'.$_GET['page'].'.php'))){
  3.         include('rep/'.$_GET['page'].'.php');
  4.  }
  5.     elseif(!isset($_GET['page'])){
  6.  include('rep/accueil.php');
  7.  }
  8.     else{
  9.     include('include/erreur.php');
  10.  }
  11. ?>


 
 :??:

Reply

Marsh Posté le 10-04-2005 à 19:17:21    

tu utilise $_GET... donc si un gars rentre dans l adresse de la page page=../special_folder/pass_file.txt ca va passer... donc ya faille ;) du moins il me semble...

Reply

Marsh Posté le 10-04-2005 à 19:21:24    

Oui, on peut inclure tout fichier PHP en jouant avec les ../
Mais le problème c'est pas forcément ton code : tout autre script sur le compte peut présenter une faille, même phpbb, dotclear, phpmyadmin...

Reply

Marsh Posté le 10-04-2005 à 19:36:12    

did'jyou!  :ouch:  
encore ça va, on pourrait inclure un fichier mais qui sera forcement sur MON serveur.  :kaola:  
 
comment je peux corriger ça sinon?  :whistle:

Reply

Marsh Posté le 10-04-2005 à 19:40:45    

bah si tu demande de remplir un formulaire, utlise method=POST et dans le script du dessus remplace GET par POST ;) sinon ya la solution dont je t aiparlé avant ou tu crée un tableau avec les seul fichier qui on le droit d etre "include"... solution pas tres viable quand tu a 30.000 fichiers ;)
 
Renseigne toi aussi sur : "register global".. le mettre sur OFF te permet de pas mal limiter les problemes ;)
 

Reply

Marsh Posté le 10-04-2005 à 19:48:16    

pmusa a écrit :

did'jyou!  :ouch:  
encore ça va, on pourrait inclure un fichier mais qui sera forcement sur MON serveur.  :kaola:  
 
comment je peux corriger ça sinon?  :whistle:

Regarde l'article de fred.
En résumé, tu fais quelque chose comme :
 

if($_GET['page'] === 'content'){
 $file = 'content.php';
}
 
include('inc/'.$file);


Tu peux adapter ça à ta sauce comme le fait Fred. L'important c'est que le nom du fichier ne provienne pas d'une variable transmisse par l'utilisateur.
 
En PHP5 il y a la très pratique function __autoload.

shrito a écrit :

bah si tu demande de remplir un formulaire, utlise method=POST et dans le script du dessus remplace GET par POST ;)

Ca change rien.  :heink:

Reply

Marsh Posté le 10-04-2005 à 19:53:46    

il est bien sympa fred mais quand j'ai plein de page?  :sweat:  
ce qui me plaisiat dans ma methode c'est que j'ai plus rien à declarer dans mon code après.  :)  
j'avais juste a faire  

Code :
  1. ?page=ma_page


 
comme ça, pas besoin de rajouter des lignes de code.  :jap:  
sa combine elle est bien si on a 5 pages, moi j'en ai environ ~160, par là...  :sweat:  
 
mais je peux quand même laisser comme ça hein dites?  :heink:

Reply

Marsh Posté le 10-04-2005 à 19:57:27    

C'est qu'un include sur des fichiers PHP, c'est très méchant pour un petit site.
Fait quand même une petite regex sur ta var, ça coute rien. [:itm]

Reply

Marsh Posté le 10-04-2005 à 19:58:40    

Sinon 160 pages, il serait peut-être temps de mettre tout ça dans une bdd ?

Reply

Marsh Posté le 10-04-2005 à 20:01:51    

Kalex tu réponds à ca :  
 
bah si tu demande de remplir un formulaire, utlise method=POST et dans le script du dessus remplace GET par POST ;)
 
Ca change rien.
 
ta entierement raison  :lol:  je sais pas ou j avais la tete... le gars peut mettre ce qu il veut dans le fomulaire ;)

Reply

Marsh Posté le 10-04-2005 à 20:01:54    

bah euhh les regex je suis pas encore pret a les aborder et encore moins les appliquer, ça me depasse ça.
mettre des pages dans une bdd?  :heink:

Reply

Marsh Posté le 10-04-2005 à 20:03:07    

pmusa a écrit :

bah euhh les regex je suis pas encore pret a les aborder et encore moins les appliquer, ça me depasse ça.
mettre des pages dans une bdd?  :heink:


 
je pense qu'il parle de ce que je te proposé plutot...
 

Citation :

$var["page1"]=nom_page1.php;
$var["page2"]=nom_page2.php;
$var["page3"]=nom_page3.php;
$var["page4"]=nom_page4.php;
$var["page5"]=nom_page5.php;
 
tu crée un tableau avec les pages autorisée...
ensuite :
 
include ($var[$variable]);

Reply

Marsh Posté le 10-04-2005 à 20:04:46    

Personellement j'ai stocke dans ma base les pages php que j'utilise.
Donc les parametres que je passe dans l'url c'est "l'id" de la page.
Donc la, pas besoin de rajouter du code, suffit de rajouter la page dans la bonne table et c'est bon.

Reply

Marsh Posté le 10-04-2005 à 20:05:53    

tu parle pour la bdd shriko?
ça je te dis j'en ai trop la flemme. tu m'imagine reprendre mes 160 pages pour les indexer dans un fichier avec des tableaux?  :(
 
edit:
 
vous voulez pas me donner un exemple de code plus complet et parlant je pige pas bien là heinggg.  :??:  
des pages dans un bdd j'ai jamais vu ça moi.  :heink:


Message édité par pmusa le 10-04-2005 à 20:07:57
Reply

Marsh Posté le 10-04-2005 à 20:07:13    

ui je parle pour la BDD...
 
tu sait meme avec 160 pages c'est simple, il suffit de faire une boucle while pour crée la BDD.. en fait tu demande a ta fonctin de lire tt les fichier d un repertoire et de les enredistré dans la BDD...

Reply

Marsh Posté le 10-04-2005 à 20:09:27    

shrito a écrit :

ui je parle pour la BDD...
 
tu sait meme avec 160 pages c'est simple, il suffit de faire une boucle while pour crée la BDD.. en fait tu demande a ta fonctin de lire tt les fichier d un repertoire et de les enredistré dans la BDD...


ouè c'est puissant ça.  :sol:  
concrètement ça donne quoi avec du code siouplé.

Reply

Marsh Posté le 10-04-2005 à 20:09:43    

$handle=opendir("le_repertoire" );
 
while ($tmp = readdir($handle))
{
if($tmp!="." && $tmp!=".." )
{
$temp=explode(".", $tmp);
$var[$temp[0]]=$tmp;
}
}
 
et la tu as un truc du style
 
$var[page1]="page1.php"
$var[page2]="page2.php"
$var[page3]="page3.php"
$var[page4]="page4.php"
...
...
 
a toi de virer les fichier indésirable apres..

Reply

Marsh Posté le 10-04-2005 à 20:12:41    

Attention une bdd ça stoque... des données ! Et JAMAIS de code php.
 
edit : En fait, je parlais de mettre le contenu de ses pages dans une base de données avec un id et tout, et non de créer un index comme tu le proposes shrito.


Message édité par kalex le 10-04-2005 à 20:16:01
Reply

Marsh Posté le 10-04-2005 à 20:15:30    

ouhhhh chu largué là.  :pfff:
'comprend pô les mecs.
 
ça va m'obliger à faire plein de modifs dans mes leins ça en plus non?  [:aloy]

Reply

Marsh Posté le 10-04-2005 à 20:15:40    

kalex a écrit :

Attention une bdd ça stoque... des données ! Et JAMAIS de code php.


on par le pas de BDD SQL la... c'est un peu stupide d utiliser du SQL pour ce genre de chose.
 
en fait une fois que tu a crée $var
 
tu fais $var=serialize($var); // qui permet d enregistrer un tableau dans un fichier
et tu l enregistre dans un fichier que tu chargera ensuite dans tes pages...
 
utiliser SQL sert a rien ici si ce n est a consommer des ressource inutilement
 
PS : aucune modif a faire ;)
PS2: Ah ok Kadex ;)


Message édité par shrito le 10-04-2005 à 20:16:46
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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