You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
7.2 KiB
PHP
212 lines
7.2 KiB
PHP
<?php
|
|
/*
|
|
* "livre d'or" avec des failles mises volontairement.
|
|
* L'objectif de ce site est de s'entrainer à l'exploitation de failles en
|
|
* injection SQL, directory transversal etc...
|
|
* Et surtout de comprendre la nécessité de se protéger de ce genre de négligences
|
|
* car la destruction du système de la machine est surement ce que le hacker peut faire
|
|
* de moins méchant.
|
|
*
|
|
* Ne pas utiser sur un serveur en production!
|
|
*
|
|
*Codé à la va vite par Gnieark http://blog-du-grouik.tinad.fr avril 2013
|
|
*
|
|
*/
|
|
|
|
//***** Parametres de connexion MySQL ****
|
|
$mysql_host='localhost';
|
|
$mysql_user='';
|
|
$mysql_password='';
|
|
$mysql_database='';
|
|
//***** FIN des parametres ****
|
|
|
|
|
|
session_start();
|
|
//y a t-il une action?
|
|
if (isset($_POST['act'])){
|
|
$act=$_POST['act'];
|
|
}else{
|
|
$act="";
|
|
}
|
|
|
|
//connexion mysql
|
|
if (!mysql_connect($mysql_host, $mysql_user, $mysql_password)) {
|
|
echo "Impossible de se connecter à MySQL";
|
|
die;
|
|
}
|
|
mysql_query("USE ".$mysql_database);
|
|
|
|
switch($act){
|
|
case "auth":
|
|
//authentifier ou non l'user
|
|
$rs=mysql_query("SELECT 1 FROM users
|
|
WHERE pseudo='".mysql_real_escape_string($_POST['identifiant'])."'
|
|
AND password='".mysql_real_escape_string($_POST['password'])."'");
|
|
|
|
if($r=mysql_fetch_row($rs)){
|
|
$_SESSION['user_id']=$_POST['identifiant'];
|
|
}else{
|
|
echo "l'authentification a raté";
|
|
die;
|
|
}
|
|
|
|
break;
|
|
|
|
case "sinscrire":
|
|
//inscrire
|
|
//verifier le mot de passe
|
|
if(($_POST['password'] !== $_POST['repeatPassword']) || ($_POST['password']=="")){
|
|
echo "ERREUR Le mot de passe doit etre identique à sa confirmation et ne peut pas etre vide";
|
|
die;
|
|
}
|
|
//verifier si le pseudo est libre
|
|
$rs=mysql_query("SELECT 1 FROM users WHERE pseudo='".mysql_real_escape_string($_POST['identifiant'])."'");
|
|
if($r=mysql_fetch_row($rs)){
|
|
echo "ce pseudo est déja pris, désolé";
|
|
die;
|
|
}
|
|
|
|
mysql_query("
|
|
INSERT INTO users (pseudo, password)
|
|
VALUES ('".mysql_real_escape_string($_POST['identifiant'])."',
|
|
'".mysql_real_escape_string($_POST['password'])."')");
|
|
|
|
break;
|
|
case "postUnMessage":
|
|
//Verifier que l'user soit bien connecté
|
|
if(!isset($_SESSION['user_id'])){
|
|
echo "Vous n'etes pas (plus) connecté";
|
|
die;
|
|
}
|
|
|
|
//s'il y a un fichier
|
|
$filename="";
|
|
$tmp_file = $_FILES['piecejointe']['tmp_name'];
|
|
//echo $_FILES['fichieroriginal']['tmp_name'];
|
|
if( is_uploaded_file($tmp_file) )
|
|
{
|
|
//déplacer le fichier dans un dossier
|
|
|
|
if( !move_uploaded_file($tmp_file, $_SERVER['DOCUMENT_ROOT']."/uploads/".$_FILES['piecejointe']['name']) )
|
|
{
|
|
echo "Impossible de copier le fichier dans ".$_SERVER['DOCUMENT_ROOT']."/uploads/".$_FILES['piecejointe']['name'];
|
|
die;
|
|
}else{
|
|
$filename=$_FILES['piecejointe']['name'];
|
|
}
|
|
}
|
|
|
|
//Une requete pour enregistrer:
|
|
//avec des groses failles
|
|
|
|
mysql_query("INSERT INTO messages(time,pseudo,message,couleur,piecejointe) VALUES (
|
|
NOW(),
|
|
'".$_SESSION['user_id']."',
|
|
'".mysql_real_escape_string(htmlentities($_POST['message']))."',
|
|
'".$_POST['couleur']."',
|
|
'".$filename."');");
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
case "":
|
|
//y'avait pas d'action définie, rien
|
|
break;
|
|
default:
|
|
//ça c'est pas normal, on kill la suite
|
|
die;
|
|
break;
|
|
}
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta name="KEYWORDS" content="le Livre D'or"/>
|
|
<meta name="author" content="Gnieark">
|
|
<link rel="icon" href="favicon.ico" type="image/x-icon" />
|
|
<link rel="stylesheet" type="text/css" href="livredor.css" />
|
|
</head>
|
|
<body>
|
|
<h1>Le livre d'or de la DCRI</h1>
|
|
<p>Ce livre d'or utilise une base de donnée mySQL (évidemment), et j'ai fait exprès de ne pas protéger certains champs contre les tentatives d'injection SQL. Il y a aussi des failles XSS, et une possibilité de faire du directory transversal.</p>
|
|
<p>Vos missions sont les suivantes:</p>
|
|
<ul>
|
|
<li>Réussir à récupérer la liste des utilisateurs et de leurs mots de passe</li>
|
|
<li>Nuire au site en modifiant /créant un fichier robots.txt interdisant aux robots de l'indexer</li>
|
|
<li>ajouter du javascript sur la page d'accueil</li>
|
|
</ul>
|
|
<?php
|
|
//tester si l'user est authentifié
|
|
if((!isset($_SESSION['user_id'])) OR ($_SESSION['user_id']== '0')){
|
|
?>
|
|
<div id="containerConnect">
|
|
<h2>Vous devez vous identifier pour poster sur le livre d'or</h2>
|
|
<fieldset id="auth"><legend>S'identifier</legend>
|
|
<form method="post" action="index.php">
|
|
<input type="hidden" name="act" value="auth"/>
|
|
<p><label for="identifiant">Identifiant:</label><input type="text" name="identifiant" id="identifiant"/></p>
|
|
<p><label for="password">Mot de passe</label><input type="password" name="password" id="password"/></p>
|
|
<p><label></label><input type="submit" value="S'authentifier"/></p>
|
|
|
|
</form>
|
|
</fieldset>
|
|
<fieldset id="inscrire"><legend>S'inscrire</legend>
|
|
<form method="post" action="index.php">
|
|
<input type="hidden" name="act" value="sinscrire"/>
|
|
<p><label for="inscrirePseudo">Choississez votre identifiant:</label><input type="text" name="identifiant" id="inscrirePseudo"/></p>
|
|
<p><label for="inscPass">Votre mot de passe</label><input type="password" name="password" id="inscPass"/></p>
|
|
<p><label for="insRepeatPass"> Confirmez votre mot de passe</label><input type="password" name="repeatPassword" id="insRepeatPass"/></p>
|
|
<p><label></label><input type="submit" value="S'inscrire"/></p>
|
|
</form>
|
|
</fieldset>
|
|
</div>
|
|
<?php
|
|
}else{
|
|
echo "<h2>Vous êtes connecté en tant que ".$_SESSION['user_id'].".</h2>";
|
|
?>
|
|
<fieldset id="postUnMessage"><legend>Mettre un message sur le livre d'or</legend>
|
|
<form method="POST" enctype="multipart/form-data" action="index.php">
|
|
<input type="hidden" name="act" value="postUnMessage"/>
|
|
<p><label for="message">Message:</label><textarea id="message" name="message"></textarea></p>
|
|
<p><label for="couleur">Couleur du message:</label>
|
|
<select id="couleur" name="couleur" style="color: #fff;">
|
|
<option style="background-color:#000000;" value="#000000;">Noir</option>
|
|
<option style="background-color:#333333;" value="#333333;">GRIS</option>
|
|
<option style="background-color:#FF358B;" value="#FF358B;">ROSE</option>
|
|
<option style="background-color:#01B0F0;" value="#01B0F0;">BLEU</option>
|
|
<option style="background-color:#AEEE00;" value="#AEEE00;">jaune pipi</option>
|
|
</select>
|
|
<p><label for="piecejointe">Pièce jointe:</label><input type="file" name="piecejointe" id="piecejointe"/></p>
|
|
<p><label></label><input type="submit" value="poster"/></p>
|
|
|
|
|
|
</form>
|
|
</fieldset>
|
|
<?php
|
|
}
|
|
|
|
//efficher la liste des messages
|
|
$rs=mysql_query("SELECT time,pseudo,message,couleur,pieceJointe FROM messages ORDER BY time DESC");
|
|
while($r=mysql_fetch_row($rs)){
|
|
echo "<p>De: ".$r[1]." le ".$r[0]."</p><p style=\"border-bottom: dotted; color:".$r[3].";\">".nl2br($r[2])."<br/>";
|
|
//pièce jointe
|
|
if($r[4]==""){
|
|
echo "<i>Pas de pièce jointe</i>";
|
|
}else{
|
|
if(!isset($_SESSION['user_id'])){
|
|
echo "vous devez etre connecté pour voir la pièce jointe.";
|
|
}else{
|
|
echo '<a href="file.php?f='.$r[4].'">'.$r[4].'</a>';
|
|
}
|
|
}
|
|
echo "</p>";
|
|
|
|
}
|
|
|
|
?>
|
|
</body>
|
|
</html>
|