10 vulnérabilités courantes en matière de sécurité internet

Grégory Hénique — 15/09/2022

Pour un trop grand nombre d’entreprises, ce n’est qu’après une violation de la sécurité que les meilleures pratiques de sécurité Web deviennent une priorité.

Les problèmes de sécurité du développement web est obscur pour un grand nombre de programmeurs.

Une approche efficace des menaces de sécurité du Web doit, par définition, être proactive et défensive. À cette fin, nous cherchons à susciter un état d’esprit de sécurité et à injecter au lecteur une bonne dose de paranoïa.

➟ Ce guide se concentre sur la sensibilisation et l’atténuation de 10 pièges communs et importants en matière de sécurité Web.

Je classerais cette question dans la catégorie des problèmes de maintenance/déploiement.

Avant d’incorporer un nouveau code, faites des recherches, et éventuellement des audits.

Utiliser le code d’une personne prise au hasard sur GitHub, par exemple, peut être pratique, mais ce n’est pas sans risque de grave vulnérabilité en matière de sécurité web.

J’ai vu de nombreux cas où des sites ont été pris en charge (c’est-à-dire où une personne extérieure obtient un accès administratif à un système), parce que des logiciels tiers (par exemple des plugins WordPress) sont restés sans correctifs pendant des années en production.

Si vous pensez qu’ils ne trouveront pas votre installation cachée de phpmyadmin, laissez-moi vous présenter DirBuster.

➟ La leçon à tirer ici est que le développement de logiciels ne se termine pas lorsque l’application est déployée.

…surtout si elle contient des composants tiers ou open source.

Prévention :

Les programmeurs et les professionnels de l’informatique expriment souvent leur confusion quant à la distinction entre autorisation et authentification.

L’utilisation de l’abréviation auth pour les deux termes augmente le flou qui les entoure.

Définissons et clarifions cette distinction :

En d’autres termes, l’authentification consiste à savoir qui est une entité, tandis que l’autorisation concerne ce qu’une entité donnée peut faire. En gardant cela à l’esprit, explorons 10 problèmes courants de vulnérabilité d’internet.

Les failles d’injection résultent d’un échec classique du filtrage des entrées non fiables.

Le problème ici est que l’attaquant peut injecter des commandes pour détourner les navigateurs des clients, ce qui entraîne une perte de données.

Tout ce que votre application reçoit d’une source non fiable doit être filtré, de préférence selon une liste blanche. L’utilisation d’une liste noire à cette fin n’est pas recommandée, car elle est difficile à configurer correctement.

Une liste noire est également considérée comme facile à contourner par un pirate. Les logiciels antivirus fournissent généralement de très bons exemples de listes noires défaillantes.

Prévention :

La protection contre l’injection consiste « simplement » à filtrer nos entrées et à déterminer les expéditeurs auxquels on peut faire confiance.

Le filtrage est une entreprise considérable car nous devons traiter toutes les entrées à moins qu’elles ne soient incontestablement fiables.

Si nous filtrons 999 entrées dans un système qui en compte 1 000, il nous reste un champ qui peut être le talon d’Achille et faire tomber notre système.

L’utilisation de l’injection SQL de second ordre pour injecter le résultat d’une requête SQL dans une autre est également considérée comme dangereuse. Cela peut sembler être une bonne idée car la base de données est fiable. Mais si le périmètre ne l’est pas, notre entrée pourrait provenir indirectement d’une source malveillante.

Le filtrage étant assez difficile à réaliser, il est conseillé de s’appuyer sur les fonctions de filtrage du framework. Leur efficacité est prouvée et elles ont fait l’objet d’un examen approfondi.

Si vous n’utilisez pas encore de framework, considérez les avantages en matière de sécurité des serveurs qu’il y a à en adopter un.

derriere son ordinateur

Les problèmes qui peuvent survenir lors d’une authentification brisée ne proviennent pas nécessairement d’une seule et même cause.

Il n’est pas recommandé de déployer votre propre code d’authentification, car il est difficile à réaliser correctement. Il existe une multitude de pièges possibles, en voici quelques-uns :

  1. L’URL peut contenir l’ID de session et le divulguer dans l’en-tête de référence.
  2. Les mots de passe peuvent ne pas être chiffrés lors du stockage et/ou du transit.
  3. Les identifiants de session peuvent être prévisibles, ce qui rend l’accès non autorisé un peu trop facile.
  4. La fixation de la session peut être possible.
  5. Le détournement de session peut se produire si les délais d’attente ne sont pas correctement mis en œuvre, ou si l’on utilise le protocole HTTP (sans sécurité SSL), etc.

Prévention :

La manière la plus directe d’éviter les vulnérabilités de sécurité web liées à l’authentification brisée est d’implémenter un framework.

Si vous développez votre propre code, soyez paranoïaque et renseignez-vous sur les problèmes potentiels qui peuvent survenir.

Un attaquant envoie des balises JavaScript en entrée à votre application Web.

Lorsque cette entrée est renvoyée à l’utilisateur sans être nettoyée, le navigateur de l’utilisateur l’exécute. Il s’agit d’une défaillance assez répandue de l’assainissement des entrées, essentiellement une sous-catégorie des failles d’injection.

Prévention :

Ne renvoyez pas de balises HTML au client. Cela vous protégera également contre l’injection HTML, qui consiste pour un attaquant à injecter du contenu HTML brut (comme des images ou des lecteurs Flash bruyants mais invisibles).

Pour mettre en œuvre cette solution, convertissez toutes les entités HTML pour qu’elles renvoient autre chose.

Par exemple, convertissez <script> pour qu’elle renvoie &lt;script&gt;.

Vous pouvez également utiliser des expressions régulières pour éliminer les balises HTML en utilisant des expressions régulières sur < et >. Mais c’est dangereux car certains navigateurs peuvent ne pas interpréter le HTML sévèrement cassé.

Il est préférable de convertir tous les caractères en leurs équivalents.

Il s’agit d’un cas classique où l’on fait confiance à l’entrée de l’utilisateur et où l’on paie le prix en héritant d’une vulnérabilité de sécurité résultante.

Une référence directe à un objet signifie qu’un objet interne (par exemple, un fichier ou une clé de base de données) est exposé à l’utilisateur, ce qui nous rend vulnérables aux attaques.

L’attaquant peut fournir cette référence et, si l’autorisation n’est pas appliquée ou si elle n’est pas respectée, l’attaquant peut entrer.

Par exemple, le code comporte un module download.php qui lit et laisse l’utilisateur télécharger des fichiers, en utilisant un paramètre CGI pour spécifier le nom du fichier (par exemple, download.php?file=quelquechose.txt).

Si le développeur a omis l’autorisation dans le code, l’attaquant peut maintenant l’utiliser pour télécharger des fichiers système accessibles à l’utilisateur qui exécute PHP (par exemple, le code de l’application ou des données aléatoires du serveur comme les sauvegardes).

➟ Un autre exemple de vulnérabilité de référence directe à un objet non sécurisée est une fonction de réinitialisation de mot de passe qui s’appuie sur la saisie de l’utilisateur pour déterminer son identité.

Après avoir cliqué sur l’URL valide, un attaquant pourrait modifier le champ du nom d’utilisateur dans l’URL pour dire quelque chose comme « admin » .

Soit dit en passant, j’ai souvent vu ces deux exemples « dans la nature » .

Prévention :

Effectuez l’autorisation de l’utilisateur correctement et systématiquement, et mettez les choix sur une liste blanche.

Le plus souvent, la vulnérabilité peut être évitée en stockant les données en interne et en ne comptant pas sur les données transmises par le client via des paramètres CGI.

Les variables de session dans la plupart des frameworks sont bien adaptées à cet effet.

D’après mon expérience, il est fréquent de rencontrer des serveurs et des applications web mal configurés. Quelques exemples :

Prévention :

Disposez d’un bon processus (de préférence automatisé) de « construction et de déploiement » , qui peut exécuter des tests lors du déploiement.

La solution du pauvre en matière de mauvaise configuration de la sécurité consiste à utiliser des crochets post-commit, afin d’empêcher le code de sortir avec des mots de passe par défaut et/ou des éléments de développement intégrés.

Cette vulnérabilité de sécurité web concerne la cryptographie et la protection des ressources.

Les données sensibles doivent être chiffrées à tout moment, y compris en transit et au repos. Aucune exception.

Évidemment, l’algorithme de cryptage/hachage ne doit pas être faible. En cas de doute, les normes de sécurité du web recommandent l’AES (256 bits et plus) et le RSA (2048 bits et plus).

On ne saurait trop insister sur le fait que les identifiants de session et les données sensibles ne doivent pas voyager dans les URL. Les cookies contenant des données sensibles doivent avoir le drapeau « sécurisé » activé.

Prévention :

➟ Et au risque d’énoncer une évidence, ne stockez pas les clés de chiffrement à proximité des données protégées.

C’est comme si vous stockiez votre vélo avec un cadenas dont la clé se trouve à l’intérieur.

Protégez vos sauvegardes par chiffrement et gardez vos clés privées. Et bien sûr, ne perdez pas les clés !

liberte de paroles menacee sur les reseaux sociaux

Il s’agit d’une défaillance qui se produit si une autorisation appropriée n’est pas effectuée lorsqu’une fonction est appelée sur le serveur.

Les développeurs ont tendance à penser que, puisque le côté serveur génère l’interface utilisateur, le client ne peut pas accéder à une fonctionnalité qui n’est pas fournie par le serveur. Ce n’est pas aussi simple que cela, car un attaquant peut toujours falsifier une requête vers la fonctionnalité « cachée » .

Un attaquant ne sera pas dissuadé par le fait que la fonctionnalité souhaitée n’est pas facilement accessible.

Imaginez qu’il y ait un panneau /admin, et que le bouton ne soit présent dans l’interface utilisateur que si l’utilisateur est effectivement un administrateur. Rien n’empêche un attaquant de découvrir et d’utiliser cette fonctionnalité à mauvais escient si l’autorisation fait défaut.

Prévention :

Du côté du serveur, l’autorisation doit toujours être effectuée.

Dans cette attaque (également appelée attaque par confusion), un tiers malveillant trompe le navigateur en abusant de son autorité pour faire quelque chose pour l’attaquant.

…pour émettre une requête vers un site cible (par exemple, votre banque).

Si, dans un onglet du navigateur, vous êtes connecté à votre banque et si celle-ci est vulnérable à ce type d’attaque, un autre onglet peut être autorisé à faire en sorte que votre navigateur utilise ses informations d’identification à mauvais escient pour le compte de l’attaquant, ce qui donne lieu au problème de la confusion du suppléant.

L’adjoint est le navigateur qui abuse de son autorité (cookies de session) pour exécuter les instructions de l’attaquant.

Prévention :

Stockez un jeton secret dans un champ de formulaire caché, inaccessible à un site tiers. Cela nécessite bien sûr que vous vérifiiez le champ caché.

Certains sites peuvent demander un mot de passe avant de vous permettre de modifier des paramètres sensibles (comme un email de rappel du mot de passe).

Cela pourrait empêcher l’utilisation abusive de vos sessions abandonnées sur des ordinateurs publics.

Il s’agit encore d’un problème de filtrage des entrées.

Supposons que le site cible possède un module redirect.php qui prend une URL comme paramètre GET. La manipulation du paramètre peut créer une URL sur sitevictime.com qui redirige le navigateur vers virusinfecte.com.

Un utilisateur verrait le lien comme sitevictime.com/blablabla, ce qui semble suffisamment inoffensif pour qu’il fasse confiance et clique. Mais cliquer sur ce lien pourrait transférer l’utilisateur vers une page de dépôt de logiciels malveillants (ou toute autre page malveillante).

L’attaquant peut aussi rediriger le navigateur vers sitevictime.com/deleteprofile?confirm=1.

Il convient de mentionner que l’insertion d’une entrée définie par l’utilisateur dans un en-tête HTTP peut conduire à une injection d’en-tête, ce qui est assez grave.

Prévention :

En savoir plus ➟ Comment effacer toute trace des sites visités

J’espère que j’ai réussi à titiller votre cerveau et à introduire une bonne dose de paranoïa et de sensibilisation aux failles de sécurité des sites Web.

Ce qu’il faut retenir, c’est que les pratiques logicielles ancestrales existent pour une bonne raison.

Ce qui s’appliquait à l’époque aux débordements de tampon s’applique encore aujourd’hui aux chaînes de caractères décapées en Python. Les protocoles de sécurité nous aident à écrire des programmes meilleurs et plus sûrs, ce à quoi nous devons aspirer.

Veuillez utiliser ces connaissances de manière responsable, et ne testez pas de pages sans autorisation !