Pour trop d’entreprises, ce n’est que après une faille de sécurité s'est produite que les meilleures pratiques de sécurité Web deviennent une priorité. Au cours de mes années de travail en tant que professionnel de la sécurité informatique, j'ai vu à maintes reprises à quel point le monde des problèmes de sécurité du développement Web peut être obscur pour tant de mes collègues programmeurs .
Une approche efficace des menaces de sécurité Web doit, par définition, être proactive et défensive. À cette fin, cet article vise à susciter un état d'esprit de sécurité, en injectant, espérons-le, au lecteur une bonne dose de paranoïa.
En particulier, ce guide se concentre sur 10 écueils de sécurité Web courants et importants à prendre en compte, y compris des recommandations sur la manière de les atténuer. L'accent est mis sur la Top 10 des vulnérabilités Web identifié par le Ouvrir le projet de sécurité des applications Web (OWASP) , une organisation internationale à but non lucratif dont le but est d'améliorer la sécurité des logiciels à travers le monde.
Lorsque je parle avec d'autres programmeurs et professionnels de l'informatique, je rencontre souvent une confusion concernant la distinction entre autorisation et authentification. Et bien sûr, le fait que l'abréviation auth est souvent utilisé pour les deux contribue à aggraver cette confusion commune. Cette confusion est si courante que ce problème devrait peut-être être inclus dans cet article en tant que «Common Web Vulnerability Zero».
Alors avant de continuer, clarifions la distinction entre ces deux termes:
Dit d'une autre manière, authentification c'est savoir qui est une entité, tandis que autorisation c'est savoir ce qu'une entité donnée peut faire. Dans cet esprit, examinons les 10 principaux problèmes de sécurité Internet.
Les défauts d'injection résultent d'un échec classique de filtrage des entrées non fiables. Cela peut arriver lorsque vous transmettez des données non filtrées au serveur SQL (injection SQL), au navigateur (XSS - nous en parlerons plus tard ), vers le serveur LDAP (injection LDAP), ou ailleurs. Le problème ici est que l'attaquant peut injecter des commandes à ces entités, entraînant une perte de données et le piratage des navigateurs des clients.
Tout ce que votre application reçoit de sources non fiables doit être filtré, de préférence selon une liste blanche. Vous ne devriez presque jamais utiliser une liste noire, car il est très difficile et généralement facile à contourner. Les produits logiciels antivirus fournissent généralement des exemples stellaires d'échecs de listes noires. La correspondance de modèle ne fonctionne pas.
La prévention: La bonne nouvelle est que la protection contre l'injection consiste «simplement» à filtrer correctement votre entrée et à se demander si une entrée peut être fiable. Mais la mauvaise nouvelle est que tout les entrées doivent être correctement filtrées, à moins qu'elles ne puissent être incontestablement fiables (mais le dicton «ne jamais dire jamais» vient à l'esprit ici).
Dans un système avec 1000 entrées, par exemple, filtrer avec succès 999 d'entre elles n'est pas suffisant, car cela laisse encore un champ qui peut servir de guérison d'Achille pour faire tomber votre système. Et vous pourriez penser que mettre un résultat de requête SQL dans une autre requête est une bonne idée, car la base de données est approuvée, mais si le périmètre ne l'est pas, l'entrée provient indirectement de personnes malintentionnées. C'est appelé Injection SQL de second ordre au cas où vous seriez intéressé.
Étant donné que le filtrage est assez difficile à faire correctement (comme la cryptographie), ce que je conseille généralement est de s'appuyer sur les fonctions de filtrage de votre framework: elles ont fait leurs preuves et sont minutieusement examinées. Si vous n'utilisez pas de frameworks, vous devez vraiment vous demander si ne pas les utiliser a vraiment un sens dans le contexte de la sécurité de votre serveur. 99% du temps, ce n'est pas le cas.
Il s’agit d’un ensemble de problèmes pouvant survenir lors d’une authentification interrompue, mais ils ne sont pas tous dus à la même cause fondamentale.
En supposant que quelqu'un veuille toujours rouler son propre code d'authentification en 2014 (à quoi pensez-vous ??), je le déconseille. Il est extrêmement difficile de bien faire et il existe une myriade de pièges possibles, pour n'en citer que quelques-uns:
La prévention: Le moyen le plus simple d'éviter cette vulnérabilité de sécurité Web est d'utiliser un framework. Vous pourrez peut-être l'implémenter correctement, mais le premier est beaucoup plus facile. Au cas où vous voudriez rouler votre propre code, soyez extrêmement paranoïaque et renseignez-vous sur les pièges. Il y en a pas mal.
Il s'agit d'un échec de désinfection des entrées assez répandu (essentiellement un cas particulier de erreur courante n ° 1 ). Un attaquant donne à votre application Web des balises JavaScript en entrée. Lorsque cette entrée est renvoyée à l’utilisateur non assainie, le navigateur de l’utilisateur l’exécutera. Cela peut être aussi simple que de créer un lien et de persuader un utilisateur de cliquer dessus, ou cela peut être quelque chose de beaucoup plus sinistre. Lors du chargement de la page, le script s'exécute et, par exemple, peut être utilisé pour envoyer vos cookies à l'attaquant.
La prévention: Il existe une solution de sécurité Web simple: ne renvoyez pas de balises HTML au client. Cela a l'avantage supplémentaire de se défendre contre l'injection HTML, une attaque similaire par laquelle l'attaquant injecte du contenu HTML brut (comme des images ou des lecteurs flash invisibles bruyants) - pas à fort impact mais sûrement ennuyeux («s'il vous plaît, arrêtez-le!»). Habituellement, la solution de contournement consiste simplement à convertir tous Entités HTML , donc cela est renvoyé comme . L'autre méthode de nettoyage souvent utilisée consiste à utiliser des expressions régulières pour supprimer les balises HTML à l'aide d'expressions régulières sur
<
et >
, mais c'est dangereux car de nombreux navigateurs interpréteront très bien le HTML gravement endommagé. Mieux vaut convertir tous les personnages en leurs homologues échappés.
Il s'agit d'un cas classique de confiance dans les entrées de l'utilisateur et de payer le prix d'une vulnérabilité de sécurité qui en résulte. Une référence d'objet directe signifie qu'un objet interne tel qu'un fichier ou une clé de base de données est exposé à l'utilisateur. Le problème avec cela est que l'attaquant peut fournir cette référence et, si l'autorisation n'est pas appliquée (ou est rompue), l'attaquant peut accéder ou faire des choses dont il devrait être exclu.
Par exemple, le code a un download.php
module qui lit et permet à l'utilisateur de télécharger des fichiers, en utilisant un paramètre CGI pour spécifier le nom du fichier (par exemple, download.php?file=something.txt
). Soit par erreur, soit par paresse, le développeur a omis l'autorisation du code. L'attaquant peut maintenant l'utiliser pour télécharger tous les fichiers système auxquels l'utilisateur exécutant PHP a accès, comme le code de l'application lui-même ou d'autres données laissées sur le serveur, comme les sauvegardes. Oh-oh.
tailles de requêtes multimédias pour un design réactif
Un autre exemple de vulnérabilité courant est une fonction de réinitialisation de mot de passe qui s'appuie sur l'entrée de l'utilisateur pour déterminer le mot de passe que nous réinitialisons. Après avoir cliqué sur l'URL valide, un attaquant peut simplement modifier le username
dans l'URL pour dire quelque chose comme «admin».
Soit dit en passant, ces deux exemples sont des choses que j'ai moi-même vues apparaître souvent «dans la nature».
La prévention: Effectuez l'autorisation des utilisateurs correctement et de manière cohérente et ajoutez les choix à la liste blanche. Le plus souvent, cependant, tout le problème peut être évité en stockant les données en interne et en ne se fiant pas à ce qu'elles soient transmises par le client via les paramètres CGI. Les variables de session dans la plupart des frameworks sont bien adaptées à cette fin.
D'après mon expérience, les serveurs Web et les applications qui ont été mal configurés sont bien plus courants que ceux qui ont été configurés correctement. Peut-être parce que les moyens de foirer ne manquent pas. Quelques exemples:
La prévention: Avoir un bon processus de «construction et déploiement» (de préférence automatisé), qui peut exécuter des tests lors du déploiement. La solution de mauvaise configuration de la sécurité du pauvre est les hooks post-commit, pour 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 protection de la cryptographie et des ressources. Les données sensibles doivent être cryptées à tout moment, y compris en transit et au repos. Aucune exception. Les informations de carte de crédit et les mots de passe des utilisateurs doivent jamais voyager ou être stockés non chiffrés, et les mots de passe doivent toujours être hachés. De toute évidence, l'algorithme de cryptage / hachage ne doit pas être faible - en cas de doute, les normes de sécurité Web recommandent AES (256 bits et plus) et RSA (2048 bits et plus) .
Et s'il va sans dire que les identifiants de session et les données sensibles ne doivent pas voyager dans les URL et que les cookies sensibles doivent avoir le drapeau sécurisé, cela est très important et ne peut pas être surestimé.
La prévention:
En transit: Utilisation HTTPS avec un certificat approprié et PFS (Perfect Forward Secrecy) . N'acceptez rien sur les connexions non HTTPS. Avoir le drapeau sécurisé sur les cookies.
En stock: C'est plus difficile. Tout d'abord, vous devez réduire votre exposition. Si vous n'avez pas besoin de données sensibles, déchiquetez-les. Les données que vous ne possédez pas ne peuvent pas être volé . Ne stockez pas les informations de carte de crédit déjà , car vous ne voulez probablement pas avoir à faire face à Conforme PCI . Inscrivez-vous avec un processeur de paiement tel que Bande ou Braintree . Deuxièmement, si vous avez des données sensibles dont vous avez réellement besoin, stockez-les cryptées et assurez-vous que tous les mots de passe sont hachés. Pour le hachage, utilisez bcrypt est recommandé. Si vous n'utilisez pas bcrypt, renseignez-vous sur salaison et tables arc-en-ciel .
Et au risque de dire l'évidence, ne stockez pas les clés de cryptage à côté des données protégées . C’est comme ranger votre vélo avec un cadenas contenant la clé. Protégez vos sauvegardes avec le cryptage et gardez vos clés très privées. Et bien sûr, ne perdez pas les clés!
Il s'agit simplement d'un échec d'autorisation. Cela signifie que lorsqu'une fonction est appelée sur le serveur, une autorisation appropriée n'a pas été effectuée. Souvent, les développeurs s'appuient sur le fait que le côté serveur a généré l'interface utilisateur et pensent que la fonctionnalité non fournie par le serveur n'est pas accessible par le client. Ce n’est pas aussi simple que cela, car un attaquant peut toujours forger des requêtes vers la fonctionnalité «cachée» et ne sera pas découragé par le fait que l’UI ne rend pas cette fonctionnalité facilement accessible. Imaginez qu'il y ait un /admin
panneau, et le bouton n'est présent dans l'interface utilisateur que si l'utilisateur est en fait un administrateur. Rien n'empêche un attaquant de découvrir cette fonctionnalité et de l'utiliser à mauvais escient si l'autorisation est manquante.
La prévention: Côté serveur, l'autorisation doit toujours être terminé. Oui toujours. Aucune exception ou vulnérabilité n'entraînera de graves problèmes.
Ceci est un bel exemple d'un député confus attaque par laquelle le navigateur est dupé par une autre partie en abusant de son autorité. Un site tiers, par exemple, peut amener le navigateur de l’utilisateur à abuser de son autorité pour faire quelque chose pour l’attaquant.
Dans le cas de CSRF, un site tiers émet des demandes au site cible (par exemple, votre banque) en utilisant votre navigateur avec vos cookies / session. Si vous êtes connecté sur un onglet de la page d’accueil de votre banque, par exemple, et qu’elle est vulnérable à cette attaque, un autre onglet peut faire en sorte que votre navigateur utilise mal ses informations d’identification au nom de l’attaquant, ce qui entraîne un problème d’assistant confus. L'adjoint est le navigateur qui abuse de son autorité (cookies de session) pour faire quelque chose que l'attaquant lui demande de faire.
Prenons cet exemple:
L'attaquante Alice veut alléger le portefeuille de Todd ciblé en lui transférant une partie de son argent. La banque de Todd est vulnérable au CSRF. Pour envoyer de l'argent, Todd doit accéder à l'URL suivante:
img / back-end / 29/10-les-vulnérabilités-de-sécurité-web-les plus courantes.jpg
Une fois cette URL ouverte, une page de réussite est présentée à Todd et le transfert est effectué. Alice sait également que Todd visite fréquemment un site sous son contrôle à blog.aliceisawesome.com, où elle place l'extrait suivant:
En visitant le site Web d'Alice, le navigateur de Todd pense qu'Alice renvoie à une image et émet automatiquement une requête HTTP GET pour récupérer l'image, mais cela demande en fait à la banque de Todd de transférer 1 500 $ à Alice.
Incidemment, en plus de démontrer la vulnérabilité CSRF, cet exemple montre également la modification de l'état du serveur avec une requête HTTP GET idempotente qui est en soi une vulnérabilité sérieuse. Requêtes HTTP GET doit être idempotent (sûr), ce qui signifie qu'ils ne peuvent pas modifier la ressource accessible. N'utilisez jamais, jamais, jamais de méthodes idempotentes pour changer l'état du serveur.
Fait amusant: CSRF est également la méthode utilisée par les gens pour le bourrage de cookies jusqu'à ce que les affiliés deviennent plus sages.
La prévention: Stockez un jeton secret dans un champ de formulaire caché qui est inaccessible depuis le site tiers. Vous devez bien sûr toujours vérifier ce champ caché. Certains sites vous demandent également votre mot de passe lors de la modification de paramètres sensibles (comme votre e-mail de rappel de mot de passe, par exemple), même si je soupçonne que cela est là pour empêcher l'utilisation abusive de vos sessions abandonnées (dans un cybercafé par exemple).
Le titre dit tout. Je classerais à nouveau cela comme un problème de maintenance / déploiement. Avant d'incorporer un nouveau code, effectuez des recherches, éventuellement des audits. Utilisation du code que vous avez reçu d'une personne au hasard GitHub ou un forum peut être très pratique, mais n'est pas sans risque de faille de sécurité Web sérieuse.
J'ai vu de nombreux exemples, par exemple, où des sites possédé (c'est-à-dire lorsqu'un étranger obtient un accès administratif à un système), non pas parce que les programmeurs étaient stupides, mais parce qu'un logiciel tiers est resté sans correctif pendant des années en production. Cela se produit tout le temps avec les plugins WordPress par exemple. Si vous pensez qu'ils ne trouveront pas votre caché phpmyadmin
installation, laissez-moi vous présenter dirbuster.
La leçon à tirer ici est que le développement logiciel ne s'arrête pas lorsque l'application est déployée. Il doit y avoir de la documentation, des tests et des plans sur la façon de le maintenir et de le maintenir à jour, surtout s'il contient des composants tiers ou open source.
La prévention:
Soyez prudent. Au-delà de la prudence évidente lors de l'utilisation de tels composants, ne soyez pas un codeur copier-coller. Inspectez attentivement le morceau de code que vous êtes sur le point d’introduire dans votre logiciel, car il pourrait être irrémédiablement endommagé (ou dans certains cas, intentionnellement malveillant - des attaques de sécurité Web sont parfois involontairement invitées de cette manière).
Tiens-toi à jour. Assurez-vous que vous utilisez les dernières versions de tout ce en qui vous avez confiance et prévoyez de les mettre à jour régulièrement. Abonnez-vous au moins à une newsletter sur les nouvelles vulnérabilités de sécurité concernant le produit.
C'est encore une fois un problème de filtrage d'entrée. Supposons que le site cible a un redirect.php
module qui prend une URL comme GET
paramètre. La manipulation du paramètre peut créer une URL sur targetsite.com
qui redirige le navigateur vers malwareinstall.com
. Lorsque l'utilisateur voit le lien, il voit targetsite.com/blahblahblah
sur lequel l'utilisateur pense qu'il est digne de confiance et qu'il est sûr de cliquer. Ils ne savent pas que cela les transférera réellement sur une page de dépôt de logiciels malveillants (ou sur toute autre page malveillante). L'attaquant peut également rediriger le navigateur vers targetsite.com/deleteprofile?confirm=1
.
Il convient de mentionner que le remplissage d'une entrée définie par l'utilisateur non approuvée dans un en-tête HTTP peut conduire à injection d'en-tête ce qui est assez mauvais.
La prévention: Les options comprennent:
J'espère avoir réussi à chatouiller un peu votre cerveau avec cet article et à introduire une bonne dose de paranoïa et de sensibilisation à la vulnérabilité de la sécurité des sites Web.
un développeur appelle avec un problème. ils essayaient de déboguer
Le principal à retenir ici est que les pratiques logicielles séculaires existent pour une raison et que ce qui s'appliquait à l'époque pour les débordements de tampon, s'applique toujours aux chaînes marinées en Python aujourd'hui. Les protocoles de sécurité vous aident à écrire des programmes (plus) corrects, auxquels tous les programmeurs devraient aspirer.
Veuillez utiliser ces connaissances de manière responsable et ne pas tester les pages sans autorisation!
Pour plus d'informations et plus attaques spécifiques côté serveur , jettes un coup d'oeil à: https://www.owasp.org/index.php/Category:Attack .
Les commentaires sur ce post et ses conseils d'atténuation sont les bienvenus et appréciés. De futurs postes connexes sont prévus, notamment sur la question déni de service distribué (DDoS) et les vulnérabilités de sécurité informatique à l'ancienne (pas sur le Web). Si vous avez une demande spécifique sur le type de protection Web sur lequel écrire, n'hésitez pas à me contacter directement à [email protected]
Voici la sécurité du site Web! À votre santé.
En relation:Les menaces à la sécurité Internet sont des méthodes permettant d'abuser de la technologie Web au détriment d'un site Web, de ses utilisateurs ou même d'Internet en général. Ils proviennent de sites Web mal configurés, qui ont été programmés par inadvertance avec des vulnérabilités ou qui reposent sur des composants eux-mêmes vulnérables.
Les 10 principales menaces de sécurité Internet sont les failles d'injection et d'authentification, XSS, les références d'objets directes non sécurisées, la mauvaise configuration de la sécurité, l'exposition aux données sensibles, le manque d'autorisation au niveau des fonctions, le CSRF, les composants non sécurisés et les redirections non filtrées.
Assurez-vous que toutes les redirections effectuées par votre site (via les en-têtes HTTP, les balises méta, JavaScript, etc.) ne reposent pas sur l'entrée de l'utilisateur, ou si elles le font, que l'entrée de l'utilisateur est nettoyée, par exemple via une liste blanche.
Un jeton CSRF permet à un serveur de savoir que la demande provient de l'utilisateur de son propre site, et non d'un autre site Web visité par l'utilisateur. En effet, il est transmis à chaque demande via un champ de formulaire caché, empêchant les sites malveillants d'agir au nom de leurs téléspectateurs via des attaques CSRF.
Également appelée entrée «sale» ou «non approuvée», une entrée non validée est toute entrée envoyée à votre serveur. Tout morceau de code qui utilise une telle entrée sans le nettoyer au préalable est une faille de sécurité qui peut être retournée contre vous, vos utilisateurs et même des passants innocents.
L'injection SQL se produit lorsque votre code place une entrée non validée directement dans une instruction SQL, au lieu d'utiliser une requête paramétrée (c'est-à-dire une avec des espaces réservés.) Heureusement, les attaques par injection SQL sont l'une des plus faciles à atténuer, car la prise en charge des requêtes paramétrées est intégrée dans chaque base de données accéder à la bibliothèque.
XSS exploite des implémentations malavisées d'une «fonctionnalité» d'application Web commune: recevoir du HTML d'un utilisateur et le présenter à d'autres utilisateurs. Étant donné que du code HTML non filtré peut contenir du JavaScript, un attaquant peut alors exécuter du code pour le compte d'autres utilisateurs lors de la prochaine utilisation de l'application Web en question.
Une mauvaise configuration de la sécurité implique souvent l'utilisation de valeurs par défaut qui doivent être modifiées: clés et mots de passe, accès aux données et aux services qui est initialement libéral pour la commodité de configuration et de test, et néglige les mises à jour de sécurité en cours.
C'est lorsque le serveur n'est pas programmé pour vérifier l'autorisation pour une fonction donnée. Cela vient souvent d'une mentalité de «sécurité par l'obscurité»: on suppose à tort que si une fonctionnalité sensible n'est pas montrée à tout le monde, les attaquants potentiels ne le découvriront jamais.
L'exposition de données sensibles se produit lorsqu'une application (soit par sa propre faille, soit par l'abus d'une vulnérabilité par un attaquant) révèle les données privées d'un utilisateur (par exemple, les numéros de carte de crédit) à un tiers non autorisé: d'autres utilisateurs, partenaires commerciaux, employés ou le Publique.