1. Sécurisation des sites web
EMNA BEY (GL4)
SAHAR DRIDI (RT3)
GHADA ESSAIED (RT3)
MOHAMED AYMEN KARMOUS (RT2)
2. Sécurisation des sites web |SECURILIGHT 2013
1
Table des matières
I. Présentation de l'atelier.................................................................................................... 2
II. Présentation des outils utilisés.......................................................................................... 2
1. WampServer.................................................................................................................. 2
2. Notepad ++.................................................................................................................... 2
3. VMware Workstation .................................................................................................... 2
III. Topologie du réseau...................................................................................................... 3
IV. Développement............................................................................................................. 3
1. Développement du site web ......................................................................................... 3
2. Sécurisation du site web................................................................................................ 6
a. Injection SQL.................................................................................................................. 6
b. Faille XSS........................................................................................................................ 7
c. Faille Include.................................................................................................................. 8
d. Faille Upload................................................................................................................ 10
e. Les CAPTCHA ............................................................................................................... 13
f. Le fichier .htaccess ...................................................................................................... 14
V. Conclusion ....................................................................................................................... 15
3. Sécurisation des sites web |SECURILIGHT 2013
2
I. Présentation de l'atelier
Nombreuses sont les personnes ayant l'envie de créer leur site par leurs propres moyens
malgré le déclin des tarifs pour la création des sites Web et les efforts menés par les agences
Web afin de proposer des sites toujours plus performants, adaptés au budget des
consommateurs.
Cependant il ne faut pas oublier que le développement Web est une "discipline"
relativement complexe et demande un investissement personnel considérable, ce qui peut
s'avérer très rapidement un vrai casse tête lorsque l'on débute dans la matière. Cette
problématique peut engendrer l'ouverture de failles de sécurité sur un site Web.
C'est pour remédier à ce problème que vous avons élaboré cet atelier permettant de
sécuriser un site web.
II. Présentation des outils utilisés
Pour réaliser cet atelier nous avons utilisé:
1. WampServer
C'est une plate-forme de développement Web sous Windows pour des applications Web
dynamiques à l’aide du serveur Apache2, du langage de scripts PHP et d’une base de
données MySQL. Il possède également PHPMyAdmin pour gérer plus facilement les bases
de données.
2. Notepad ++
C' est un éditeur de code source qui prend en charge plusieurs langages et que nous avons
utilisé pour créer nos pages html, php, etc...
3. VMware Workstation
C'est un logiciel de virtualisation permetant la création d'une ou plusieurs machines
virtuelles au sein d'un même système d'exploitation (généralement Windows ou Linux),
ceux-ci pouvant être reliés au réseau local avec une adresse IP différente, tout en étant sur
la même machine physique (machine existant réellement).
4. Sécurisation des sites web |SECURILIGHT 2013
3
III. Topologie du réseau
Notre serveur est WampServeur installé sur une machine Windows 7. Il nous permet
d'exécuter des scripts PHP et d'accéder à une base de données MySQL grâce à
PHPMyAdmin.
Notre client est, quant à lui, une machine virtuelle Backtrack qui tourne sur VMware en
mode bridged pour qu'elle ait sa propre adresse IP.
IV. Développement
1. Développement du site web
Commençons par créer un mini site web qui nous permettra d'exploiter les différentes failles
de sécurité et par la suite de les corriger.
5. Sécurisation des sites web |SECURILIGHT 2013
4
Ce site comporte les pages suivantes:
La page inscription.php qui permet à internaute de créer un compte.
La page connexion.php qui permet à un membre de se connecter.
6. Sécurisation des sites web |SECURILIGHT 2013
5
La page espace-membre.php qui permet à un membre de voir son profil
La page ajoutPhoto.php qui permet à un membre d'uploader une image.
La page photpAjoute.php qui permet de visualiser l'image ajoutée.
7. Sécurisation des sites web |SECURILIGHT 2013
6
2. Sécurisation du site web
Maintenant que notre site est près, nous pouvons tester dessus les différentes failles de
sécurité et les sécuriser par la suite.
a. Injection SQL
Qu'est ce que l'injection SQL?
Cette faille apparaît quand il est possible d'injecter du code SQL dans les requêtes qui sont
faites dans une page web. C'est actuellement la "meilleure" vulnérabilité Web en rapport
fréquence/surface d'exploitation. Les conséquences d'une faille SQL peuvent être multiples,
du contournement de formulaires d'authentification au dump complet de la base de
données en passant par l'exécution arbitraire de code.
Comment l'exploiter?
Sur le site que nous avons développé, pour se connecter, on remplie le formulaire avec les
informations login et mot de passe. La page utilise ces informations pour envoyer la requête
mysql_query("SELECT bdd_id FROM membres WHERE bdd_login='$login' AND
bdd_mdp='$mdp'") sachant que $login et $mdp sont respectivement l'identifiant et le mot
de passe.
Un hacker peut saisir les valeurs suivantes:
$login = nimporte_quoi
$mdp = ' OR '1' = '1
la requete devient mysql_query("SELECT bdd_id FROM membres WHERE
bdd_login='nimporte_quoi' AND bdd_mdp='' OR '1' = '1'")
Vu que 1 = 1 est toujours vrai, l'utilisateur va être connecté en utilisant les infirmations du
premier membre récupéré de la base de données.
Ce type de faille est en général facile à reconnaître, puisque si l'on injecte un simple
guillemet dans le formulaire, une erreur interviendra (pour peu que les rapports d'erreurs
soient activés, ce qui est le cas par défaut ; sinon il est tout de même possible en général
d'observer des différences de comportement comme l'apparition d'une page vide).
Comment s'en protéger?
Une simple quotte « ' » peut couper la requête pour ensuite la modifier comme on le
souhaite. Le problème vient du fait que l'on n'a pas protéger ce caractère. En effet, pour
pouvoir utiliser des (antislash) ou des ' (simples quottes) dans une chaine de caractères, on
a besoin de rajouter un « » devant autrement dit il faut échapper ce caractère pour ne pas
le prendre en compte.
Avec PHP, il y a une multitude de fonctions permettant d'échapper ce genre de caractères
(strreplace, stripslashes ...) mais pour une meilleure pratique on utilise la fonction prévue
exprès pour ça et qui est mysql_real_escape_string() dans le cas d'une utilisation d'une base
de données MySql. Par exemple pour sécuriser les variable $login et $mpd utilisé dans la
requête précédente on devra faire:
$login = mysql_real_escape_string($login);
8. Sécurisation des sites web |SECURILIGHT 2013
7
$mdp = mysql_real_escape_string($mdp);
b. Faille XSS
Qu'est ce que la faille XSS?
La faille XSS (cross-site scripting) est une technique qui consiste à injecter du code HTML
contenant du JavaScript dans vos pages pour le faire exécuter à vos visiteurs.
Comment l'exploiter?
Si on appelle la page inscription.php de cette façon:
http://localhost/site_non_securise/connexion.php?erreur=<B>SecuriNet<%2FB>
Sachant que "%2F" remplace "/", on verra que le mot SecuriNets s'est affiché en gras. Le site
est donc vulnérable.
On peut aussi déclencher une alerte avec <script>alert('SecuriNets');</script>
Mettons, par exemple, ce script dans l'un des champs de la page d'inscription de notre site
et faisons notre inscription. A chaque fois qu'on se connecte avec ce nouveau compte, une
boite de dialogue, affichant SecuriNets, s'ouvre.
Certains pensent alors à supprimer <script> en faisant:
$texte = str_replace("<script>", "",$texte);
Mais ceci ne sert à rien si on lui passe:
<scr<script>ipt>alert("SecuriNets")</scr<script>ipt>
De plus, il n'y a pas que la balise script qui permet de lancer des scripts JavaScript, on trouve,
par exemple, le BBCode Image:
<img src="javascript:alert(' SecuriNets ')"/>
9. Sécurisation des sites web |SECURILIGHT 2013
8
On peut aussi utiliser onmouseover, onload, ... sur n'importe quelle balise; comme on peut
très bien encoder le texte.
Les choses deviennent vraiment critiques si le visiteur est assez malin pour récupérer vos
cookies de cette façon-là. Les cookies stockent des informations sur votre session et parfois
des informations plus confidentielles, comme votre pseudonyme et votre mot de passe sur
le site ! Il est possible de forcer le visiteur qui lira le code JavaScript à envoyer tous les
cookies qu'il a enregistrés pour votre site web, ce qui peut conduire au vol de son compte
sur ce site.
Comment s'en protéger?
Pour échapper le code HTML, il suffit d'utiliser la fonction htmlspecialchars() qui va
transformer les chevrons des balises HTML <> en < et > respectivement. Cela
provoquera l'affichage de la balise plutôt que son exécution.
$login=htmlspecialchars (trim($_POST['login']));
Il faut penser à utiliser cette fonction sur tous les textes envoyés par l'utilisateur qui sont
susceptibles d'être affichés sur une page web.
Si vous préférez retirer les balises HTML que le visiteur a tenté d'envoyer plutôt que de les
afficher, il faut utiliser la fonction strip_tags().
c. Faille Include
Qu'est ce que la faille Include?
La fonction include permet, comme son nom l’indique, d’inclure une page dans une autre ,
on l’utilise comme ceci:
<?php
include("page.php");
?>
Si toutes vos pages requièrent la page config.php dans laquelle sont contenues les
informations de connexion a la base de données, il convient de l’inclure dans chacune de vos
pages plutôt que de retaper l’équivalent de mysql.php dans toutes celle-ci.
La fonction include vous permet de n’avoir qu’une seule page config.php, et toutes les pages
de votre site l’incluront.
Comment l'exploiter?
Supposons que nous avons la page index.php suivante:
<?php
if (isset($_GET["page"]))
include($_GET["page"]);
else include ('connexion.php');
?>
10. Sécurisation des sites web |SECURILIGHT 2013
9
Ce code permet d'afficher la page passée en paramètre ou bien la page par défaut qui est
connexion.php.
Si on tape http://localhost/site_non_securise/index.php?page=inscription.php la page
inscription s'affiche .
Si on tape http://localhost/site_non_securise/index.php?page=http://www.google.com
alors la page Google s'exécutera et s'affichera sur notre serveur.
Maintenant, si cette page en question est une backdoor comme c99.php on peut alors lister
tous les fichiers, les éditer, en créer, accéder à la base de données, etc...
Il est aussi possible, avec cette faille, d’exécuter un fichier se trouvant sur le serveur
vulnérable. Et d’ailleurs, c’est parfois la seule possibilité, car certaines protections
désactivent la possibilité d’inclure du code situé sur un autre serveur.
Comment s'en protéger?
La meilleure façon pour corriger une Include est de :
Faire un test pour chaque pages de votre site, certes c’est long mais il n’y a pas
mieux.
switch ($page) {
case "inscription":
include("inscription.php");
break;
case "connexion":
include("connexion.php");
break;
case "espace-membre":
include("espace-membre.php");
break;
default:
include ("connexion.php");
}
En php4, mettre la commande allow_url_fopen à off. Cette dernier permet la lecture
de fichiers situés sur un autre serveur;
En php5, mettre la commande allow_url_include à off. C’est un apport par rapport à
php4, qui distingue les fichiers lus des fichiers inclus.
11. Sécurisation des sites web |SECURILIGHT 2013
10
d. Faille Upload
Qu'est ce que la faille Upload?
L’upload permet le transfert des fichiers depuis votre machine qui est le client vers le site qui
est le serveur, mais souvent les scripts d’upload contiennent des vulnérabilités.
La faille upload est une faille permettant d’uploader des fichiers avec une extension non
autorisée, cette faille est due à la mauvaise configuration du script d’upload ou à l’absence
complète de sécurité. Celle ci est généralement présente dans les scripts d’upload d’images.
Le but de cette faille est d’uploader un fichier avec une extension non autorisée. (Par
exemple un code php) de façon à avoir un accès au serveur cible.
Comment exploiter cette faille?
Il y 'a 3 manières pour exploiter cette faille:
La plus simple:
Le serveur ne vérifie rien du tous lors de l'upload. Lorsqu'on doit choisir une image à
uploader, on choisit simplement notre fichier page.php et on envoie.
La double extension:
Certains scripts ne font que vérifier l’extension du fichier, encore cette protection peut être
bypasser en faisant une double extension par exemple ma_page.php.gif.
Bypass mime vérification:
Le type MIME, c’est le renseignement donné par $_FILES['monFichier']['type']
Certains scripts ne font que vérifier si le mime correspond aux types de fichiers autorisés par
contre une vérification de mime n’est pas suffisante parce qu’on peut bypasser cette
vérification en utilisant par exemple le module Tamper Data de Firefox.
Prenons notre page d'upload qui n'accepte que des fichiers de type GIF, JPEG, JPG ou PNG
grace à la vérification du content_type du fichier comme suit:
if (($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg")||
($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg")||
($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png"))
{
//traitement
}
12. Sécurisation des sites web |SECURILIGHT 2013
11
Activons Tamper Data comme suit:
On démarre l'altération en cliquant sur Start Tamper.
Ensuite, on sélectionne le fichier php qu'on veut uploder et on clique sur Upload. Une
nouvelle fenêtre s'ouvre, on clique sur Tamper.
13. Sécurisation des sites web |SECURILIGHT 2013
12
Une autre fenêtre s'ouvre et dans cette dernière il faut modifier, dans POST_DATA, le
content type qui est "Application/x-php" par "image/png"
Et voila notre fichier est uploadé.
14. Sécurisation des sites web |SECURILIGHT 2013
13
On peut maintenant y accéder. Comme ce fichier contient un code pour afficher le contenu
du dossier courant, on aura:
Comment s'en protéger?
Pour sécuriser un site contre cette faille on pourrait, en plus de la vérification du
content_type, rajouter:
La vérification de l'extension:
On ajoute dans notre page upload.php un tableau contenant les extensions permises et on
vérifie si l'extension de notre fichier y appartient comme suit:
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (in_array($extension, $allowedExts)){
//traitement
}
La vérification de la taille du fichier qui ne doit pas dépasser une certaine limite:
if($_FILES["file"]["size"] < 1000000){
//traitement
}
Le renommage des fichiers uploadés avant de les enregistrer
e. Les CAPTCHA
Les sites web sont visités et utilisés non seulement par des êtres humains, mais aussi par des
machines, des ordinateurs. On appelle ces programmes qui parcourent sans cesse le web
des robots (on dit aussi bot).
Certains bots ont de bonnes intentions, comme par exemple les robots d'indexation des
moteurs de recherche (appelés crawler) comme Googlebot (Google), ou Slurp (Yahoo !).
Mais d'autres bots ont des objectifs beaucoup moins louables, leur but est par exemple de
s'inscrire sur des forums de discussion pour poster des messages publicitaires (spam), ou de
poster des commentaires de spam sur un blog.
15. Sécurisation des sites web |SECURILIGHT 2013
14
L'une des solutions, pour lutter contre ces robots, consiste à soumettre l'utilisateur à un test
auquel seul un être humain est sensé être capable de répondre (on appelle ça un test de
Turing). En effet, on ajoute, tout simplement, un champ anti-spam appelé Captcha dans un
formulaire HTML qu'on souhaite protéger contre les robots.
f. Le fichier .htaccess
Un .htaccess est un fichier qui sert à indiquer des commandes pour le serveur, c'est un
fichier de configuration pour Apache.
Il permet, par exemple, de protéger certains répertoires avec des mots de passe, de
restreindre l'accès à une page Web, d'empêcher le listage des répertoires (quand ils ne
contiennent pas de fichier index.html), ou encore d'utiliser vos propres pages d'erreur (404,
403)..
Un .htaccess placé dans un répertoire agit sur ce répertoire et tous les sous-répertoires qu'il
contient.
Personnaliser les pages d'erreur:
Il peut être utile de personnaliser les pages d'erreur 404 (File Not Found), 403 (Forbidden),
500 (Internal Server Error)..., par exemple pour demander à l'internaute de signaler les liens
cassés, ou pour lui proposer de faire une recherche sur le site.
Dans se cas on mettra dans le fichier .htaccess :
ErrorDocument numero_d'_erreur /chemin/du/fichier.html
Par exemple, on veut personnaliser la page d'erreur 403, on crée la page 403.html dans le
répertoire erreurs puis, on ajoute cette ligne au fichier .htaccess:
ErrorDocument 403 /erreurs/403.html
Restrictions d'accès:
On peut interdire l'accès a notre site à partir de certaines adresses IP.
16. Sécurisation des sites web |SECURILIGHT 2013
15
Pour interdire une adresse IP :
deny from 192.168.1.1
Inversement, on peut autoriser une adresse IP :
allow from 192.168.1.2
on peut aussi utiliser allow from all et deny from all.
Interdire de lister le contenu d'un dossier:
On peut interdire le listage du contenu d'un dossier en ajoutant cette ligne dans le fichier
.htaccess:
Options -Indexes
V. Conclusion
Au cours de cet atelier, nous avons pu comprendre le fonctionnement d'un certain nombre
d'attaques et nous avons essayé de les corriger pour sécuriser tant soit peu notre site web.
Mais il faut être très vigilent car ce ne sont pas les seules problèmes qu'un site peut
rencontrer.