Tout le monde va dire "Injection SQL", car c'est la vulnérabilité la plus effrayante et la plus facile à appréhender. Le Cross-Site Scripting (XSS) arrive en deuxième position, car il est également facile à comprendre. La "mauvaise validation des entrées" n'est pas une vulnérabilité, mais plutôt l'évaluation d'une bonne pratique de sécurité.
Essayons de voir les choses sous un angle différent. Voici des fonctionnalités qui, lorsqu'elles sont mises en œuvre dans une application Web, sont susceptibles de vous mettre dans le pétrin :
-
SQL dynamique (par exemple, les constructeurs de requêtes de l'interface utilisateur). Vous savez probablement déjà que la seule façon sûre d'utiliser SQL dans une application Web est d'utiliser des requêtes paramétrées, dans lesquelles chaque paramètre de la requête est explicitement lié à une variable. Les applications Web enfreignent le plus souvent cette règle lorsque l'entrée malveillante n'est pas un paramètre évident (comme un nom), mais plutôt un attribut de la requête. Un exemple évident est celui des constructeurs de requêtes "Smart Playlist" de type iTunes que l'on voit sur les sites de recherche, où des éléments tels que les opérateurs de la clause where sont transmis directement au backend. Une autre pierre à retourner est le tri des colonnes de tableaux, où vous verrez des choses comme DESC exposées dans les paramètres HTTP.
-
Téléchargement de fichiers. Le téléchargement de fichiers perturbe les gens parce que les noms de fichiers ressemblent étrangement aux noms d'URL, et parce que les serveurs web facilitent l'implémentation de la partie "téléchargement" en dirigeant les URL vers les répertoires du système de fichiers. Sept des dix gestionnaires de téléchargement que nous testons permettent aux attaquants d'accéder à des fichiers arbitraires sur le serveur, parce que les développeurs d'applications ont supposé que les mêmes autorisations étaient appliquées à l'appel "open()" du système de fichiers que celles appliquées aux requêtes.
-
Stockage du mot de passe. Si votre application peut me renvoyer par mail mon mot de passe brut lorsque je le perds, vous échouez. Il n'y a qu'une seule réponse fiable pour le stockage des mots de passe, qui est bcrypt ; si vous utilisez PHP, vous voulez probablement PHPpass.
-
Génération de nombres aléatoires. Une attaque classique sur les applications web : réinitialiser le mot de passe d'un autre utilisateur, et, parce que l'application utilise la fonction "rand()" du système, qui n'est pas crypto-forte, le mot de passe est prévisible. Cela s'applique également partout où l'on fait de la cryptographie. Ce que, d'ailleurs, vous ne devriez pas faire : si vous vous appuyez sur la cryptographie quelque part, vous êtes très probablement vulnérable.
-
Sortie dynamique. Les gens font trop confiance à la validation des entrées. Vos chances de débarrasser les entrées des utilisateurs de tous les métacaractères possibles, surtout dans le monde réel, où les métacaractères sont des parties nécessaires des entrées des utilisateurs, sont faibles. Une bien meilleure approche consiste à mettre en place un régime cohérent de filtrage des sorties de bases de données et à les transformer en entités HTML, comme quot, gt et lt. Rails le fera automatiquement pour vous.
-
Courriel. De nombreuses applications mettent en œuvre une sorte de fonctionnalité de courrier sortant qui permet à un attaquant de créer un compte anonyme, ou de ne pas utiliser de compte du tout, pour envoyer des messages contrôlés par l'attaquant à des adresses électroniques arbitraires.
Au-delà de ces fonctionnalités, l'erreur n°1 que vous êtes susceptible de commettre dans votre application est d'exposer un ID de ligne de base de données quelque part, de sorte que l'utilisateur X puisse voir les données de l'utilisateur Y simplement en changeant un nombre de "5" en "6".