first commit
commit
a22707c052
@ -0,0 +1,7 @@
|
|||||||
|
#Simple site for Pen testing
|
||||||
|
|
||||||
|
It was quickly created on 2013.
|
||||||
|
|
||||||
|
See instructions on my blog https://blog-du-grouik.tinad.fr/post/2013/04/16/Un-site-d-entrainement-%C3%A0-l-exploitation-de-failles
|
||||||
|
|
||||||
|
(in French, sorry)
|
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*Ce fichier est un morceau du livre d'or
|
||||||
|
*
|
||||||
|
* "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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@session_start();
|
||||||
|
function sendfile($filename)
|
||||||
|
{
|
||||||
|
//N'utilisez pas cette function sur un vrai site internet!
|
||||||
|
|
||||||
|
$startPath=$_SERVER['DOCUMENT_ROOT']."/uploads/";
|
||||||
|
header('X-Sendfile: '.$startPath.$filename);
|
||||||
|
header('Content-type: '.mime_content_type($startPath.$filename));
|
||||||
|
//on indique le nom du fichier
|
||||||
|
header('Content-Disposition: attachment; filename="'.basename($startPath.$filename));
|
||||||
|
//on envoie le fichier source
|
||||||
|
readfile($startPath.$filename);
|
||||||
|
|
||||||
|
}
|
||||||
|
if(isset($_SESSION['user_id'])){
|
||||||
|
sendfile($_GET['f']);
|
||||||
|
}
|
@ -0,0 +1,211 @@
|
|||||||
|
<?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>
|
@ -0,0 +1,16 @@
|
|||||||
|
CREATE TABLE `messages` (
|
||||||
|
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
`pseudo` text NOT NULL,
|
||||||
|
`message` text NOT NULL,
|
||||||
|
`couleur` text NOT NULL,
|
||||||
|
`pieceJointe` text NOT NULL,
|
||||||
|
PRIMARY KEY (`time`,`pseudo`(5))
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
CREATE TABLE `users` (
|
||||||
|
`pseudo` varchar(10) NOT NULL,
|
||||||
|
`password` text NOT NULL,
|
||||||
|
PRIMARY KEY (`pseudo`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
|||||||
|
fieldset{
|
||||||
|
padding: 1em;
|
||||||
|
font:80%/1 sans-serif;
|
||||||
|
}
|
||||||
|
fieldset legend{
|
||||||
|
font-size: 12px;
|
||||||
|
color: #20326C;
|
||||||
|
}
|
||||||
|
fieldset textarea, fieldset input, .select40{width:40%;}
|
||||||
|
fieldset input[type=checkbox], fieldset input[type=radio] { width:15px; }
|
||||||
|
fieldset label {
|
||||||
|
float:left;
|
||||||
|
width:40%;
|
||||||
|
margin-right:0.5em;
|
||||||
|
padding-top:0.2em;
|
||||||
|
text-align:right;
|
||||||
|
}
|
||||||
|
#containerConnect{
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
#auth{
|
||||||
|
width: 40%;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
#inscrire{
|
||||||
|
width: 40%;
|
||||||
|
float: right;
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
AuthGroupFile /dev/null
|
||||||
|
AuthName "Acces restreint"
|
||||||
|
AuthType Basic
|
||||||
|
|
||||||
|
deny from all
|
Loading…
Reference in New Issue