Problème de code PHP

Problème de code PHP - PHP - Programmation

Marsh Posté le 10-09-2009 à 14:11:28    

Bonjour,
 
J'ai un site internet que j'avais codé il y a 5ans...
Actuellement mon hebergeur bloque un des fichiers car il appel un code extérieur de spam ...
Voici ce qui me dit :  

Using index2,php file, spamming was done.
This file is allowing remote file exclusion.
http://63.119.22.215/auto.txt??


 
Voici le code du fichier en question.
 
Vu que je ne touche plus dutout à la programmation depuis si une âme charitable pouvais me dire ou se situe le problème dans le script suivant :
 

Code :
  1. <?
  2. ######### Appels des fichiers de fonctions, de connexion
  3. require "functions.php";
  4. require "dbconnect.php";
  5. $langue=$_GET['lang'];
  6. if($langue=='')$langue=$_POST['lang'];
  7. require "$langue.lang";
  8. session_start();
  9. session_destroy();
  10.   $finallogin = $HTTP_COOKIE_VARS["savlogin"]; // variable pour remplir le cookie
  11.   $template = new template("templates" );
  12.   // on def le mode a appliquer
  13.   switch($action){
  14. case 'login':
  15.       $login=$_POST['nom'];
  16.       //On vérifie que le login et le mot de passe ne sont pas vides
  17.       if ($login == '') $err="$l_login_err1";
  18.       if ($_POST['password'] == '' && $err== '') $err= "$l_pass_err1";
  19.       //Par recoupement avec la BDD on vérifie que le login et le password sont corrects
  20.        if($err==''){
  21.          $sql="SELECT nom, password, id, pays FROM clients WHERE nom='$login'";
  22.          if(!$result = mysql_query($sql, $db)) die (mysql_error());
  23.          list($nom, $pass, $user_id, $pays)=mysql_fetch_row($result);
  24.          if($_POST['password']==$pass){
  25.          // on place un cookie pour le login
  26.          setcookie("savlogin", $login, (time()+15552000), "$cookiepath" );
  27.          $usr_langue=$langue;
  28.          //on cree une session pour l'utilisateur identifié
  29.          session_register("nom" );
  30.          session_register("pass" );
  31.          session_register("usr_langue" );
  32.          session_register("user_id" );
  33.          session_register("pays" );
  34.          session_start();
  35.          // on load le template
  36.          $template->lire_tpl(array("index2" => "index2$pays.html" ));
  37.          $template->stock_var_value(array(
  38.                                                    "l_err1" => $l_err,
  39.                                                    "lang" => $langue,
  40.                                                    "l_msg" => $l_welcome,
  41.                                                    ));
  42.          $template->exec_tpl("index2" );
  43.          exit();
  44.          }
  45.          else{
  46.          $err=$l_err_pass;
  47.          }
  48.        }
  49.        if($err!=''){
  50.                   //On redirige vers la page d'appel de la connexion
  51.                   $template->lire_tpl(array("login" => "login.html" ));
  52.                   $template->stock_var_value(array(
  53.                                                    "finallogin" => $finallogin,
  54.                                                    "l_user_name" => $l_user_name,
  55.                                                    "langue" => $langue,
  56.                                                    "l_valider" => $l_valider,
  57.                                                    "l_index" => $l_login_index,
  58.                                                    "l_login" => $l_login,
  59.                                                    "l_access" => $l_access,
  60.                                                    "l_password_index" => $l_password_index,
  61.                                                    "err1" => $err
  62.                                                    ));
  63.                   $template->exec_tpl("login" );
  64.                   exit();
  65.               }
  66.         Break;
  67.        default:
  68.                   $template->lire_tpl(array("login" => "login.html" ));
  69.                   $template->stock_var_value(array(
  70.                                                    "finallogin" => $finallogin,
  71.                                                    "l_user_name" => $l_user_name,
  72.                                                    "langue" => $langue,
  73.                                                    "vac" => $vac,
  74.                                                    "l_valider" => $l_valider,
  75.                                                    "l_index" => $l_login_index,
  76.                                                    "l_login" => $l_login,
  77.                                                    "l_access" => $l_access,
  78.                                                    "l_password_index" => $l_password_index
  79.                                                    ));
  80.                   $template->exec_tpl("login" );
  81.                   exit();
  82.   Break;
  83.   }
  84. ?>


 
Merci d'avance pour votre aide.
 
 

Reply

Marsh Posté le 10-09-2009 à 14:11:28   

Reply

Marsh Posté le 10-09-2009 à 14:26:53    

Indice :

Boris l'invincible a écrit :

Code :
  1. require "$langue.lang";



Reply

Marsh Posté le 10-09-2009 à 14:28:37    

require "$langue.lang";  
Le contenu de $langue venant d'un $_GET ou $_POST, sans aucun contrôle derrière, ça me paraît très risqué.
Ensuite, tu fais session_start(); suivi d'un session_destroy();
C'est très bizarre ça...
 
Après, session_register() est obsolète, on utilise $_SESSION[]
 
setcookie() peut-être aussi poser un soucis...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-09-2009 à 14:37:58    


 
ok merci je suppose donc que c'est bcp mieux si je remplace par :
 

Code :
  1. require "http://nomdusite.com/$langue.lang";


Reply

Marsh Posté le 10-09-2009 à 15:14:01    

bof. Je vérifierais surtout que le fichier $langue.lang existe bien sur ton serveur avant de l'inclure.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-09-2009 à 15:38:20    

rufo a écrit :

bof. Je vérifierais surtout que le fichier $langue.lang existe bien sur ton serveur avant de l'inclure.


 
oui il existe bien un fichier nl.lang pour le neerlandais et un fichier fr.lang pour le francais, sur la page index principale l'utilisateur à le choix de la langue, c'est cette variable qui était renvoyé par GET.

Reply

Marsh Posté le 10-09-2009 à 15:40:02    

Test alors par exemple que $langue ne contient que 2 caractères alphabétiques

Reply

Marsh Posté le 11-09-2009 à 10:10:12    

moi, je pensais surtout à faire :
if (file_exists($langue.lang))
{
    require "$langue.lang";
}
 
Ca me paraît quand même plus sécurisé...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-09-2009 à 10:31:27    

Nan, faut quand-même vérifier le format, sinon on peut toujours ouvrir n'importe quoi genre :

Code :
  1. pouet.php?langue=/etc/passwd%00


Donc, faire :

Code :
  1. $langue = isset($_GET['langue']) ? strtolower($_GET['langue']) : null;
  2. if($langue == null) {
  3.   throw new Exception('Une langue est attendue en paramètre');
  4. }
  5. if(!preg_match('/^[a-z]{2,2}$/', $langue)) {
  6.   throw new Exception('Identificateur de langue invalide');
  7. }
  8. if(!is_file($langue . '.lang')) {
  9.  
  10.   $langFiles = glob('*.lang');
  11.   $langs = array();
  12.   foreach($langFiles as $file) {
  13.     $langs[] = basename($file, '.lang');
  14.   }
  15.   throw new Exception('Langue non supportée. Langues valides : ' . implode(', ', $langs));
  16. }
  17. require $langue . '.lang';


Message édité par FlorentG le 11-09-2009 à 10:34:02
Reply

Sujets relatifs:

Leave a Replay

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