Sécurité des applications Web
Publié par Sebastien D. il y a environ un an
La sécurité informatique est devenue de plus en plus importante avec la généralisation de l'utilisation d'internet dans la vie quotidienne.
Concernant les applications Web (du site web au logiciel basé sur le web) il convient de les protéger au moins un minimum afin qu'elles ne soient pas détournées de leur utilisation première.
Nous allons faire un tour rapide des différentes attaques que peuvent subir des applications web ainsi que des différents moyens de s'en prémunir. La liste n'est pas exhaustive mais a pour objectif de vous aider à limiter les soucis. Ces exemples seront essentiellement basés sur la plate forme PHP - qui est la plus utilisée aujourd'hui - mais pourront être transposés facilement si vous utilisez ASP, etc..
- Url mal formées
- L'arborescence de votre site
- Injections SQL
- Vols de sessions
- Les attaques de type "man in the middle"
- Mécanismes d'authentification basés sur javascript, Java, ou ActiveX
- Cross site scripting
- Cookie poisoning
- Conclusion
Url mal formées
Intérêt ?
Ces urls malformées envoyées au serveur Web essaient de faire accéder à des zones non autorisées du serveur ou de lui faire exécuter des commandes non prévues.
Voici quelques exemples de ces urls malformées provenant de logs d'Apache.
Exemple
- XXX.XXX.XXX.XXX - - [14/Jul/2003:13:59:47 +0200] "GET /default.ida?XXXXXXXXXXXXXXXXXXXX%u9090%u[...]cbd3%u0%u00=a HTTP/1.0" 404 308 XXX.XXX.XXX.XXX - - [16/Jul/2003:19:34:05+0200] "GET /d/winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 321
Commentaires
Ces urls mal formées sont provoquées souvent par des scripts ou des virus pour exploiter une faille connue de votre serveur Web.
Que faire ?
Vous n'avez pas grand-chose à y faire, seulement maintenir à jour la version de votre serveur Web.
Complément
- Un exemple de virus :Code red
L'arborescence de votre site
Intérêt ?
Les dossiers de votre site Web vont pouvoir donner des informations intéressantes sur la façon dont être construit votre application.
Ceci n'est pas une faille de sécurité en soit, mais peut permettre notamment de savoir si vous utilisez php en mod cgi, quel est votre dossier d'images pour vous les prendre, etc, etc…
En resumé, ceci peut ammener des gens à consulter des informations que vous n'aviez pas prévu de mettre à disposition; cela peut aider des crackers à trouver des failles dans votre système; Cela peut provoquer une augmentation de la bande passante consommée ralentissant l'affichage de vos pages...
Comment font-ils ?
- En analysant le source de la page :
Par exemple vous pouvez voir IMG src= " . /pict/my_file.gif " vous en concluez donc qu'il existe un dossier pict à la racine du serveur qui contient les images ; intéressant si vous voulez récupérer toutes les images d'une url - Soit avec des logiciels qui le font à votre place par rapport à une base de signatures (ex Whisker)
Commentaire
Quelqu'un d'intéressé par vos images par exemple pourra se connecter directement via son client http préferé à http://votre_site/pict/ et avoir une liste de toutes les images qui se trouvent dans votre dossier pict.
Que faire ?
- Pour se protéger contre la recherche automatique de dossiers communs, rien de tel que de nommer vos dossiers d'une façon qui vous est propre, par exemple remplacer /lib/ par ./my_librairies/
- Pour se protéger contre l'accès intempestif des dossiers directement, cas des images, deux possibilités s'offrent à vous:
- Placez un fichier index.html dans ces dossiers pour que des qu'une personne tente d'accéder directement à ce dossier soit redirigée directement vers ce fichier. Ceci fonctionne avec tous les serveurs Web, si bien sûr sa configuration autorise la redirection sur les pages index.html (cas le plus courant)
- Si vous êtes sous Apache, vous pouvez utiliser les fichiers htaccess et htpassword pour donner des directives particulières à l'accès d'un dossier
Complément
- Whisker
- Autre scanner web: N-stealth
- class protect_picture
Injections SQL
Intérêt ?
Si votre site Web est un site dynamique, vous devez avoir un serveur de bases de données derrière qui est probablement un serveur SQL. Vous pouvez être sensible à ce genre d'attaques. L'injection SQL consiste en le détournement de données SQL de son but initial. L'exemple le plus flagrant est celui de l'authentification sur un site pour accéder à votre compte. Vous avez un login et un password que vous envoyez à l'aide d'un formulaire au script qui va vérifier votre authentification.Exemple ?
Ce script - si c'est un script php - pourrait être de la forme suivante :
- <?php
- $user = $_POST['user'] ;
- $sql = " SELECT * FROM users WHERE login = '$user' AND password ='$password'";
- $link = mysql_connect("localhost", "mysql_user", "mysql_password")or die("Could not connect: " . mysql_error());
- {
- }
- else{
- }
- ?>
Comment ?
Qu'est ce qu'il se passe si $_POST['user'] contient " admin' ;# " ? La requête devient SELECT * FROM users WHERE login = 'admin' ;#' AND password = '' Ce qui revient à faire SELECT * FROM users WHERE login = 'admin' , donc de se logguer sous administrateur… Ceci n'est qu'un exemple d'injection SQL, consultez les lectures additionnelles pour plus d'informations.Que faire ?
- Forcer le type de vos variables avec des intval, strval, etc… ; ceci vous permettra d'avoir que le type attendu
- Utiliser la fonction addslashes et activer les magic_quotes_rpc qui va echapper les caracteres qui pourraient modifier le sens de vos requêtes
- Dans l'exemple présenté, mettre select * from users where password = '' and login ='';
- Ne pas mettre le compte administrateur le premier dans votre table…
- Maintenir la version de votre serveur de base de données à jour.
- Etc, etc…
Complément
Vols de sessions
Intérêt ?
Les sessions sont utilisées quasiment partout maintenant. Elles permettent d'assurer un suivi du client pendant sa visite sur votre site ceci pour pallier au problème que le protocole http est un protocole non connecté (en d'autres termes, il n'est pas possible au serveur de pouvoir déterminer quel client visite quelle page) Ceci peut se faire de deux façons:- à l'aide de fichiers de sessions stockés sur le serveur.
- à l'aide de cookies qui sont stockés chez le client.
Exemple ?
Deux méthodes permettent de recuperer un identifiant de session.- De façon active: le hacker tente de récupérer un identifiant de session valide d'un utilisateur qui vient de se connecter, par des analyses statistiques par exemple.
- De façon passive:dans le cas ou les sessions sont gérées du coté serveur, les liens présentant l'identifiant de session (ex:http://mon_site.com/index.php?PHPSESSID=identifiant_session) etle lien est transmit à une personne tierce; cette personne va
pouvoir récupérer les informations de la session si elle n'a
pas encore expirée.- La réduction de la durée de la session. plus celle ci sera courte, moins on aura de chance de récuperer un identifiant encore valide d'une session devenue inutilisée.
- sauvegarder l'adresse ip du client dans la session et à chaque utilisation de la session, vérifier si elle correspond bien au client courant;
Comment?
Dans les deux cas, l'utilisateur recupere l'identifiant d'une session encore valide, et recupere les données qu'elle contient.Que faire ?
Vous pouvez réduire le risque de vol de sessions, par:- <?php
- // start session
- // check if the previous ip client was the same that the current
- {
- // redirection on the login page
- }
- // save the current ip from client
- $_SESSION['ip_client'] = $_SERVER['REMOTE_ADDR'];
- ?>
si vous vous trouvez sur php5, vous pouvez augmenter la taille du hash de l'identifiant session: intialement cette directive se trouve à 0 (md5) mais vous pouvez la passer à sha-1 qui fait fait passe le hash a 160 bits. Modifiez la directive correspondante dans le php.ini
- ; Select a hash function
- ; 0: MD5 (128 bits)
- ; 1: SHA-1 (160 bits)
- session.hash_function = 1
Complément
- Livre blanc de secureNet Session riding
Les attaques de type 'man in the middle'
Intérêt ?
Ce type d'attaque n'est pas spécifique des applications Web; Une attaque de type "man in the middle" correspond à l'intrusion d'une personne dans une conversation entre 2 personnes (client - serveur)Exemple ?
Quel est l'intérêt? Vols de mot de passe, de numéro de carte de crédit lors d'un paiement sur un site d'achat en ligne, les raisons sont vastes et variées.Comment ?
Je ne veux pas faire un cours de hacking, donc je vous laisse vous documenter si vous désirez en savoir plus sur les façons de procéder des hackers. Que faire ?
Pour empêcher ce type d'attaques, il faut une transaction cryptée entre le client et le serveur par l'intermédiaire d'un serveur https;la présence d'un serveur https assure l'encryption de la communication entre le client et le serveur et de ce fait, ecarte les risques de ce type d'attaque. Par contre, tant que le client ne possède pas de certificat, vous ne pouvez pas assurer que le client qui a saisi le couple login \ password correspondant à votre compte admin est bien l'administrateur de l'application. Le seul moyen d'assurer que vous communiquez bien avec la personne voulue et que personne n'écoute la communication est que le client et le serveur possèdent un certificatComplément
- Evaluer les risques de votre site ? Achille
Mécanismes d'authentification basés sur javascript, Java, ou ActiveX
Intérêt ?
Vous avez un site Web qui contient une partie authentification (partie administration, espace membre, etc...) et vous assurez l'authentification via activeX, des classes Java ou pire javascript? ceci peut poser des failles de sécurité car le code source, ou tout du moins des informations sur les procédures que vous utilisez pour authentifier peut etre visible chez le client car des fichiers sont envoyés au clientExemple ?
Quel est l'intérêt? Vols de mot de passe, de numéro de carte de crédit lors d'un paiement sur un site d'achat en ligne, les raisons sont vastes et variées.Comment ?
Il suffit d'analyser le code de vos classes ou le code source de vos javascript pour comprendre comment se fait l'authentification; de ce fait, il est plus simple pour quelqu'un qui cherche à s'authentifier sur votre site comme administrateur ou à usurper l'identité de quelqu'un pour accéder à son espace membre.Que faire ?
Pour empêcher ce type d'attaques, il faut que tout se passe du coté serveur, et que seules les données d'identifications soient du coté client; rien de tel qu'un script php pour ca :) Java le permet aussi, lorsque tout est executé du côté serveur :)Complément
Faites une recherche sur google avec java decompiler class et vous comprendrez :)...Cross site scripting
Intérêt ?
Le cross-site scripting - ou CSS - subit un énorme essort depuis quelques années, d'une part parce que ce type de failles est méconnu des developpeurs, et d'autre part par les temps de développements toujours restreints des applications. Il consiste en l'injection de script - Javascript, VBScript - dans des éléments dynamiques d'un serveur Web (php, cgi, etc...) . Elles permettent de s'attaquer aussi bien au client qu'au serveur. Prennons 2 exemples, l'un destiné au client, l'autre au serveur.Exemple ?
- <?php
- $name = $_GET['NAME'];
- echo $name;
- ?>
- Ceci est un exemple classique de "hello world". Maintenant que devient le script si au lieu de NAME=Pierrick ou NAME=Marie vous lui passez NAME=<SCRIPT>print();</SCRIPT>? une fenetre d'impression va s'ouvrir. Bon cet exemple est stupide puisque cela ne sert a rien de s'ouvrir une fenetre d'impression. Maintenant imaginez que vous arriviez à afficher le code source d'un script php, à faire le listing des fichiers, etc, cela serait certainement plus genant... :(
- L'exemple sur le client (cas du mail):Les attaques CSS sur le client servent généralement à récupérer des informations du clients tels les identifiants de sessions, les mots de passes, les valeurs de cookies, etc... Ces attaques se font généralement par l'intermédiaire d'un mail envoyé à la personne visée contenant là encore du CSS dans un lien. Prenons l'exemple d'un administrateur de forum peut scrupuleux, qui recoit un mail lui indiquant que la page ne s'affiche pas <a href= "http://www.forum_en_question.com/index.php?forum=<SCRIPT> alert("je viens de recuperer vos cookies") </SCRIPT>&page=2"> http://www.forum_en_question.com/index.php?forum=news&page=2 </a> L'administrateur n'ayant pas connaissance de ce type de vulnerabilité va cliquer sur le lien, et ainsi activer le script.
Comment ?
Avec les informations collectées, le pirate peut installer un virus, s'identifier comme administrateur, etc...Que faire ?
Pour empêcher ce type d'attaques, il faut:- Toujours être sur ses gardes :)
- Activer les magic_quote_rpc qui pourront echapper certaines valeurs passées en paramètre
- Protéger les variables affichées par des htmlentities et htmlspecialchars qui rendront inactif les balises scripts qui pourraient être présentes
Complément
Cookie poisoning
Intérêt ?
Les cookies vont permettre de personnaliser l'application en fonction du client. Ce sont de petits fichiers envoyés au client contenant des informations personnalisées tels que des mots de passe, la couleur de fond d'écran du site, ou je ne sais quoi encore. Ils ne sont accessibles que par le site qui vous l'a envoyé c'est à dire que le cookie envoyé par google ne pourra pas être lu par un autre site, et inversement. Seulement lorsque les données contenues dans les cookies sont sensibles (mot de passe, niveau d'identification et tout ce qui vous passera par la tête), du fait que le cookie soit stocké chez le client il peut être modifié. L'attaque par cookie poisoning consiste à modifier les données des cookies pour contourner les mécanismes de sécurité.Exemple ?
Cet exemple provient de Webcohort, et est basé sur l'exempled'un site marchand, l'une des application classique des cookies
avec le fameux caddie:
- GET /store/buy.asp?checkout=yes HTTP/1.0
- Host: www.onlineshop.com
- Accept: */*
- Referrer: http://www.onlineshop.com/showprods.asp
- Cookie: SESSIONID=570321ASDD23SA2321; BasketSize=3;
- Item1=2892; Item2=3210; Item3=9942;
- TotalPrice=16044;
Comment ?
Dans cet exemple, le cookie est envoyé par la page buy.asp du site onlineshop.com. Il contient d'une part l'identifiant de session de l'utilisateur et le caddie du client: ce caddie contient trois éléments avec leur identifiant et le prix total que l'utilisateur a à payer. Maintenant si l'utilisateur édite son cookie, il peut modifier son total à payer pour avoir une petite réduction :)Que faire ?
Pour empêcher ce type d'attaques, il faut:- Utiliser les sessions du coté serveur, sachant quelles peuvent être aussi sensibles à des attaques (voir la rubrique vol de session)
- Encrypter vos données dans le cookie avec un cryptage fort, de type DES, ou mieux 3DES.
- Réduisez la durée de vie de votre cookie à son minimum si vous n'en avez pas réellement besoin.
- D'une manière générale, éviter de stocker des informations chez le client si elles s'avèrent sensibles
Complément
Conclusion
J'espère que ce tutorial vous aura permis d'appréhender certains des risques que peuvent présenter les applications Webs et quelles sont les mesures que vous pouvez envisager pour les rendre plus sûres. Seulement le risque 0 n'existe pas, soyez en conscient.N'oubliez pas que la seule limite que peut rencontrer un pirate est celle de son imagination. Même si la quasi majorité des pirates sont des scripts-kiddies, il n'en reste pas moins qu'un bon pirate trouveras des failles qui n'étaient pas encore mise à jour. Le meilleur moyen de vous assurer un bon niveau de protection est de vérifier régulièrement votre sécurité par des audits de sécurité, de vous tenir au courant des différentes failles mises à jours, des exploits, etc...
liens
| securityfocus | la référence en matière de sécurité informatique; vous pourrez y trouver notamment de nombreuses mailing-list dont celles de bugtraq et de celles traitant de la sécurité des applications Web. |
| Try2Hack | Ce challange vous permet de pirater un serveur Web; A essayer :) |
| hackingzone | Ce forum propose regulièrement des challenges de hacking. le piratage autorisé pour apprendre par la pratique; jettez y regulièrement un oeil :) |
| Maximum security | Des notions générales concernant le pirage informatique; ce bouquin date un peu, mais aborde de nombreux points essentiels. |
| CIS | le "Center for Internet Security" est une association ayant pour mission de réduire sur Internet les risques dûs à une mauvaise gestion de la sécurité. |