Problème de sécurité sur interface Admin

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de sécurité sur interface Admin

Re: Problème de sécurité sur interface Admin

par Mazarini » 26 juin 2013, 15:45

Alors avant d'ajouter mysql_real_escape_string lorsque je met une quote dans un champ j'ai pas d'erreur mais elle ne'st pas stockée dans la db. J'imagine que ca doit casser le string de la requet SQL...
Les erreurs mysql ne sont pas testées. Donc tu ne voies pas les erreurs.

Dans le fichier connexion_db.php, tu peux ajouter une fonction :
function db_query($sql) {
   $result = mysql($sql);
   if (mysql_errno() != 0) {
       echo 'Erreur requete :',$sql,'<br>';
       echo mysql_error();
       exit;
   }
   return $result;
}
Et remplacer mysql_query() par db_query()

Mais ce n'est pas une vrai gestion des erreurs. Il faudrait mieux loguer les erreurs dans un fichier et faire une page d'erreur.

Re: Problème de sécurité sur interface Admin

par AntaresSys » 26 juin 2013, 15:34

Alors avant d'ajouter mysql_real_escape_string lorsque je met une quote dans un champ j'ai pas d'erreur mais elle ne'st pas stockée dans la db. J'imagine que ca doit casser le string de la requet SQL...

Parcontre après avoir ajouter mysql_real_escape_string c'est tout bon, la quote est bien stockée et il n'y a pas d'erreur !

J'ai plus qu'a passer en revu tout les formulaires.
merci beaucoup pour votre aide précieuse !

Re: Problème de sécurité sur interface Admin

par Mazarini » 26 juin 2013, 15:22

Oui, mais c'est à faire pour toutes les pages et toutes les variables utilisées dans les requêtes qui viennent de l'extérieur.
Pour les variables internes, il faut le faire pour les chaines de caractères pour éviter des erreurs en cas de présence de quotes.

Edit : Un bon test est de mettre des quotes dans les zones saisies. Si ca provoque une erreur sql, il y a une faille de sécurité.

Re: Problème de sécurité sur interface Admin

par AntaresSys » 26 juin 2013, 15:13

Ok merci pour toutes ces infos.

Donc si je résume dans la page récupérant des données par l'url, si je fais :
if ( isset( $_POST['texte'] ))  $texte = mysql_real_escape_string($_POST['texte']);
if ( isset( $_POST['id'] ))  $id= mysql_real_escape_string($_POST['id']);
	
$query = "UPDATE texte SET TEX_DEF_TEXTE = '$texte' WHERE TEX_DEF_ID = '$id'";
$result = mysql_query($query);	
je suis tout bon niveau sécurité ?

Re: Problème de sécurité sur interface Admin

par Mazarini » 26 juin 2013, 09:13

Juste un exemple.
$sql = 'select * from utilisateur where nom = "'.$_GET['nom']."' and password = '".$_GET['password']."'" 
Si $_GET['nom'] = toto et $_GET['password'] = xxx' or '1' = '1

La requête devient :'select * from utilisateur where nom = 'toto' and password = 'xxx' or '1' = '1' et retourne toujours des lignes

D'ou l'intérêt de mysql_real_escape_string()

La requête devient :'select * from utilisateur where nom = 'toto' and password = 'xxx\' or \'1\' = \'1'

Ce n'est qu'un exemple, en fonction de ton script, il peut y avoir des choses possible et d'autre non dans ce genre. Un pirate essayera diverses possibilités dans ce genre. C'est tellement classique que j'ai vu ce genre de truc réussir au premier essai sur le site fait par un professionnel qui se vantait de la sécurisation de son site :lol:

Re: Problème de sécurité sur interface Admin

par AntaresSys » 26 juin 2013, 08:53

Merci pour ta réponse.

Je suis presque sur qu'effectivement quelque chose accède a la page piscines_drop.php

Donc si je comprend bien, il me suffit de modifier tous mes scripts de la manière suivante :

$variable = mysql_real_escape_string($_GET['recupVariable']);
et ne pas toucher les requetes..

Tu confirmes ?
merci beaucoup

Re: Problème de sécurité sur interface Admin

par moogli » 25 juin 2013, 17:51

donc c'est fait par autre chose que ce script.

s'il n'y a pas d'ordre drop dedans ce n'est pas possible.

Enfin le script piscines_drop.php est ouvert aux injections SQL il serait bon de le sécuriser correctement (utilisation de mysql_real_escape_string).

ensuite il faut voir s'il y a des fichiers "nouveaux" sur ton site, surtout des fichiers que tu ne connais pas.
change des accès utilisateurs / mots de passe du serveur FTP, de l’administration du site et de la base de données (au minimum les mot de passe, je t'invite à voir avec google comment trouver un BON mot de passe).

Ensuite tu pourra faire le tour de tes script et repérer les failles (au moins injection SQL) et les colmater ;)


@+

Re: Problème de sécurité sur interface Admin

par AntaresSys » 25 juin 2013, 17:45

Désolé c'était de moi biensur le message précédent.. j'ai oublié de me logger !

Re: Problème de sécurité sur interface Admin

par Invité » 25 juin 2013, 17:44

Ben drop des tables mySql...et personne n'accedes aux pages avec des DROP. Meme pas moi.
Si tu veux, c'est sur le server, et POUF, certaines données sont supprimées des tables sans raison...

Re: Problème de sécurité sur interface Admin

par moogli » 24 juin 2013, 22:52

salut,

qu'entend tu par disparaître ?

a priori ton script devrait pas être utilisé par quelqu'un d'autre de connecté sur ton site.


je te conseil de logguer les requêtes avec heure et ip d'origine afin de voir s'il n'y a que toi qui fait cela !


@+

Problème de sécurité sur interface Admin

par AntaresSys » 24 juin 2013, 18:50

Bonjour, je suis actuellement face a un problème de sécurité sur une interface admin.

Des données dans une base MySql disparaissent sans que je sache pourquoi !
J'ai une interface sécurisée (enfin je pense!) mais je pense que quelque chose ou quelqu'un arrive a acceder au requete DROP dans certaine page et je pert des données.

Je ne pense pas que le problème viennent de la sécurité MySql qui se trouve chez un des plus gros hébergeur du marché. Le problème vient sans doute de mon code mais je sais pas comment résoudre le problème.

Voici le code des pages en question :
-------------------------------------------

Une premiere page qui affiche les donne d'une table
<?php 
	include '../include/connexion_db.php'; 
	include 'valid_login.php'; 
	include 'admin_variables_globales.php'; 
?>
<HTML>
<HEAD>	
	<LINK rel="stylesheet" href="admin_config.css">	  
</HEAD>
<BODY BGCOLOR="000000" TEXT="7D7D7D" LINK="7D7D7D" VLINK="7D7D7D" ALINK="7D7D7D" BOTTOMMARGIN="0" RIGHTMARGIN="0" LEFTMARGIN="0" MARGINWIDTH="0" TOPMARGIN="0" MARGINHEIGHT="0">
<BR>
<TABLE ALIGN="CENTER" BORDER="0" CELLPADDING="1" CELLSPACING="0" WIDTH=95%>
					<?php		
						$query = "SELECT PIS_ID, PIS_ETAT, PIS_NOM, PIS_PRIX, PIS_SOUS_CATEGORIE, PIS_STOCK FROM piscines";
						$result = mysql_query($query);
						$color= "#2C2C2C";		
							 
						while ( ($row = mysql_fetch_row($result)) )
						{					
							$id   = $row[0];
							$etat = $row[1];
							$nom  = $row[2];
							$prix = $row[3];  
							$sous_categorie_id = $row[4]; 									
							$stock = $row[5]; 																		

							$query_sous_cat = "SELECT SOU_CAT_NOM FROM sous_categories WHERE SOU_CAT_ID = '$sous_categorie_id'";
							$result_sous_cat = mysql_query($query_sous_cat);
							$row_sous_cat = mysql_fetch_row($result_sous_cat);
							$sous_categorie_nom = $row_sous_cat[0];
							
							/***********************************************************************************************************************
							AFFICHAGE DES LIGNES
							***********************************************************************************************************************/
							if ($color=="#2C2C2C"){$color="#222222";}
							else{$color="#2C2C2C";}													
							?>
							    <TR>	
									<TD VALIGN=TOP WIDTH=60 ALIGN=LEFT BGCOLOR="<?PHP echo $color; ?>">&nbsp;&nbsp;<?PHP echo $etat; ?></TD>
									<TD VALIGN=TOP ALIGN=LEFT BGCOLOR="<?PHP echo $color; ?>"><?PHP echo $sous_categorie_nom; ?></TD>											
									<TD ALIGN=LEFT BGCOLOR="<?PHP echo $color; ?>"><?PHP echo $nom; ?></TD>	
									<TD ALIGN=LEFT BGCOLOR="<?PHP echo $color; ?>">dès <?PHP echo $prix; ?> CHF</TD>
									<TD ALIGN=LEFT BGCOLOR="<?PHP echo $color; ?>"><?PHP echo $stock; ?> pièce(s) en stock</TD>											
									<TD VALIGN=TOP WIDTH=20 ALIGN=CENTER BGCOLOR="<?PHP echo $color; ?>"><A HREF="piscines_edit.php?id=<?PHP echo $id; ?>"><IMG SRC="b_edit.png" border=0></A></TD>
									<TD VALIGN=TOP WIDTH=20 ALIGN=CENTER BGCOLOR="<?PHP echo $color; ?>"><A HREF="piscines_drop.php?id=<?PHP echo $id; ?>"><IMG SRC="b_drop.png" border=0></A></TD>					
								</TR>								
							<?PHP														
						}
					?>		   
				</TABLE>	
	
</BODY>
</HTML>
	
<?php include '../include/deconnexion_db.php'; ?>	


la page piscines_drop.php qui permet de supprimer un article en fonction de $id
<?php 
	include '../include/connexion_db.php'; 
	include 'valid_login.php'; 
	include 'admin_variables_globales.php'; 
?>

<HTML>
<BODY>

<?php			
if ( isset( $_GET['id'] )) $id = $_GET['id'];

$query = "DELETE FROM piscines WHERE PIS_ID = '$id'";
$result = mysql_query($query);	

echo "<script language='javascript' type='text/javascript'>\n
	 window.location.replace('piscines.php?modif_info=drop');\n
	 </script>";	
?>

</BODY>
</HTML>

<?PHP include('../include/deconnexion_db.php'); ?>


la page connexion_db.php qui fourni les accès a MySql
<?php
	session_start();

	$db_host = "mysql.monsite.ch"; 
	$db_user = "user";
	$db_pass = "pass";
	$db_name = "nomdeladb";	 
	
	mysql_connect($db_host, $db_user, $db_pass);
	mysql_select_db($db_name);	  
?>

la page deconnexion_db.php fait juste un <?php mysql_close(); ?>

la page valid_login.php check juste sur la personne est bien passé par le login et non par l'url direct d'une page
<?PHP

	if ( isset ($_SESSION['login'] ) ){}
	else
	{    echo "<script language='javascript' type='text/javascript'>\n
	   	     window.location.replace('index.php');\n
	       	 </script>"; 
	} 	   

?>

Voila si quelqu'un peu prendre quelques minutes pour moi je lui en serai extrêmement reconnaissant !
Merci beaucoup.
bonne soirée.
David