problème de sécurité

Répondre
sparh
le 04/07/2006 à 15:29
sparh
Salut,
j'ai récemment crée une zone membre sur mon site à l'aide des sessions.
Tout allé bien jusqu'à aujourd'hui ou j'ai une petite maline qui s'amuse avec mon site.
J'explique: il y a des jeux sur mon site: pour inscrire un record il faut être inscrit.
Lors de l'enregistrement d'un record j'enregistre aussi le mail du membre qui l'a enregistré (je récupère le mail du membre dans la table utilisateur et le met dans la table record)
J'ai une petite maline qui arrive à entrer des records sans être enregistré (ca encore je veux bien immaginer que ce soit possible) mais là ou je suis surpris c'est que dans ma table record j'ai bien le mail de cette petite maline (comme si elle était membre!).
J'ai vérifier elle n'est pas inscrite dans la table utilisateur.
J'ai essayé de la contacter pour savoir comment elle faisait mais elle veut pas répondre!
Voilà si quelqu'un avait une idée pour m'aider à
1: déterminer d'ou vient la faille
2: régler le problème
... ce serait cool car je ne vois vraiment pas comment elle fait.
Merci d'avance
jackbocar
le 04/07/2006 à 15:52
jackbocar
Bonjour,

Elle s'est tout simplement inscrite sous un autre nom et ce bon mail !

Jack Bocar
sparh
le 04/07/2006 à 15:56
sparh
non son mail n'est présent nul part dans ma table utilisateur.
De plus quand on rentre les records il est possible de changer le pseudo mais pas le mail qui est caché (input type=hidden) !!!
zebden
le 04/07/2006 à 16:18
zebden
La voilà ta faille, tu mets le mail en champ caché, si ensuite tu codes en globale est facile d'usurper le mail.

On peut voir le code de validation ?
zebdinou pour les intimes / Blog : http://www.zebden.fr
sparh
le 04/07/2006 à 16:32
sparh
là je suis pas chez moi mais je vous fait parvenir touy ca ce soir!
Merci en tou cas
a +
sparh
le 04/07/2006 à 19:08
sparh
Voilà la page du formulaire pour inscrire les records:
<?
//ouverture et control de la session
session_start();
if (!isset($_SESSION['email'])) { header('Location: connect.php'); }
$var = $_SERVER['HTTP_REFERER'];
include("config.php");
//include("./include/variable.php");
$db = mysql_connect($serveur, $login, $password);
mysql_select_db($base,$db);
$sql = "SELECT ok FROM $table WHERE email='$email'";
$req = mysql_query($sql) or die('Erreur SQL!<br>'.$sql.'<br><br>'.mysql_error());
$data = mysql_fetch_array($req);

//vérification
if ($data[ok] == 'OUI')
{
echo '';
}
elseif ($data[ok] == 'NON')
{
echo 'Vous devez valider votre inscription pour accéder à cette page!';
exit();
}
//je recherche les données de la base membre de l'email du mec
$sql = "SELECT * FROM $table WHERE email = '$email'";
$resultat = mysql_query ($sql);
$change = mysql_fetch_array ($resultat);
mysql_close($db);


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<script type="text/JavaScript">
<!--
function verif_formulaire()
{
if(document.formulaire.Jeu.value == "") {
alert("Vos données ont été perdues suite a l enregistrement, fermez la fenêtre et ré-appuyez sur le bouton enregistrez votre record. Désolé ;)!");
document.formulaire.titre.focus();
return false;
}
if(document.formulaire.titre.value == "") {
alert("Veuillez entrer votre nom!");
document.formulaire.titre.focus();
return false;
}
if(document.formulaire.url.value == "") {
alert("Veuillez entrer un score!");
document.formulaire.titre.focus();
return false;
}
if(isNaN(formulaire.url.value)) {
alert("Votre score n'est pas un nombre valide, rempacez la , par un point!")
formulaire.url.focus();
return false
}
return true
}

function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { //v4.0
var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
if (val) { nm=val.name; if ((val=val.value)!="") {
if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.n';
} else if (test!='R') { num = parseFloat(val);
if (isNaN(val)) errors+='- '+nm+' must contain a number.n';
if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
min=test.substring(8,p); max=test.substring(p+1);
if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.n';
} } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.n'; }
} if (errors) alert('Vous n avez pas entré un chiffre valide!n'+errors);
document.MM_returnValue = (errors == '');
}
//-->
</script>
</head>

<body>
<?php
$Jeu = $_POST['Jeu']; ?>
<form action="VE_record.php" method="post" name="formulaire" id="formulaire" onsubmit="return verif_formulaire()">
<input type="hidden" name="Jeu" value="<? echo $Jeu ?>" />
<input type="hidden" name="email" value="<?php echo $email; ?>">
<strong>Inscrivez votre record pour
<? echo $Jeu ?></strong>
Votre nom :
<input name="titre" type="text" id="pseudo" value="<?php echo $change['pseudo']; ?>">

Votre score
<input name="url" type="text" onblur="MM_validateForm('url','','NisNum');return document.MM_returnValue" size="12" />

Commentaire
<input name="Com" type="text" size="27" maxlength="27" />

<input name="submit" type="submit" value="OK" />
</form>
</body>
</html>


Et voilà la page VE_record qui confirme et enregistre les données dans la base.
<?
//ouverture et control de la session
session_start();
if (!isset($_SESSION['email'])) { header('Location: connect.php'); }
$var = $_SERVER['HTTP_REFERER'];
include("config.php");
//include("./include/variable.php");
$db = mysql_connect($serveur, $login, $password);
mysql_select_db($base,$db);
$sql = "SELECT ok FROM $table WHERE email='$email'";
$req = mysql_query($sql) or die('Erreur SQL!<br>'.$sql.'<br><br>'.mysql_error());
$data = mysql_fetch_array($req);

//vérification
if ($data[ok] == 'OUI')
{
echo '';
}
elseif ($data[ok] == 'NON')
{
echo 'Vous devez valider votre inscription pour accéder à cette page!';
exit();
}
//je recherche les données de la base membre de l'email du mec
$sql = "SELECT * FROM $table WHERE email = '$email'";
$resultat = mysql_query ($sql);
$change = mysql_fetch_array ($resultat);
mysql_close($db);


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
<!--
#Layer3 {
position:absolute;
left:127px;
top:51px;
width:621px;
height:229px;
z-index:1;
}
-->
</style>
</head>

<body>
<div id="Layer3">
<?php
$email = $_POST['email'];
$Jeu = $_POST['Jeu'];
$prenom = $_POST['url']; //score
$nom = $_POST['titre']; //nom
$Com = $_POST['Com']; //nom
$date = date("Y-m-d H:i");
print(" Félicitation $titre ton score: $url a bien été enregistré le $date cliquez sur le bouton pour revenir à la page et actualisez la page pour voir votre score s'afficher (si vous êtes dans les meilleurs ;)!!");

$dbhost = "sql.free.fr";
$dbuser ="mabase";
$dbpass="moncode";
$dbbase="mabase";
@mysql_connect($dbhost,$dbuser,$dbpass) or die("La Connexion a échouée"); @mysql_select_db($dbbase) or die("La Base $dbbase n'existe pas");
/* On écrit dans la base les variables récupérées du formulaire*/
$enregistrement = "INSERT INTO Test (Jeux, Score, Nom, Date, Com, email) VALUES ('$Jeu','$url','$titre','$date','$Com','$email')";
mysql_query($enregistrement);
mysql_close();
?>
<FORM><INPUT TYPE='BUTTON' VALUE='Fermer'onClick='self.close()'></FORM>

</div>
</body></html>


Voilà, je viens de rajouter la verification de session sur la page VE_record mais je ne pense pas que la faille vienne de là.
Merci pour votre aide!
Frank
le 06/07/2006 à 07:47
Frank
Bonjour,

L'erreur m'a sauté aux yeux, la voici :

header('Location: connect.php');

Bien que cela redirige le navigateur, cela n'empêche pas l'exécution du script. On a donc aucun temps de voir la page en raison de la redirection. Utilisez ceci pour arrêté l'exécution et rediriger.

die(header('Location: connect.php'));

Voila
zebden
le 06/07/2006 à 12:21
zebden
Lu,

Yep bien joué ! Pour un premier message ;-)
zebdinou pour les intimes / Blog : http://www.zebden.fr
sparh
le 07/07/2006 à 18:50
sparh
je n'osais pas le dire hier mais j'avais un doute!! (même sans le "die" le script ne s'execute pas; sinon j'aurai eu plein d'enregistrements vide ou faux (à chaque fois que l'utilisateur ouvrait le lien) mais ce n'était pas le cas!)et c'est confirmé, même avec la dernière modif (ajout du "die"), des petits malins arrivent quand même à passer outre la restriction d'accès.
Voilà, j'continue à chercher mais là vraiment j'vois pas!
Répondre
LoadingChargement en cours