Le Guide du développeur sur la façon de prévenir un • WPShout

By | mai 26, 2020

WordPress pas cher

Lorsqu'il s'agit de sécuriser votre site WordPress en tant que développeur, la chose la plus efficace que vous pouvez faire est probablement de toujours nettoyer les données qu'ils obtiennent des utilisateurs. Cela signifie, généralement, deux choses, le valider ou le désinfecter en entrant dans votre système et l'échapper en sortant, réduisant ainsi les risques d'attaque par WordPress XSS.

Dans une récente enquête sur les vulnérabilités révélées dans le noyau, les plugins et les thèmes WordPress, je l'ai fait pour Sécurité WordPress en toute confiance (mon nouveau cours sur la sécurité WordPress), le type de vulnérabilité le plus courant (environ 33%) était le scriptage intersite. Les vulnérabilités de script intersite (souvent abrégées XSS) sont celles où vous pouvez permettre à un attaquant d'exécuter du JavaScript non autorisé à exécuter sur vos pages, car vous n'avez pas réussi à échapper ou à désinfecter quelque chose dans le flux de données de votre application.

Aujourd'hui, nous allons couvrir la dangerosité des scripts intersites et comment effectuer la validation, la désinfection et l'échappement dans WordPress. Mais avant de le faire, vous pouvez vous inscrire pour obtenir une vidéo très intéressante du cours, qui me montre l'exécution d'une véritable attaque WordPress XSS – montrant ainsi pourquoi elles sont importantes et comment vous protéger contre elles.

Qu'est-ce qu'une attaque WordPress XSS exactement?

Au cœur d'une attaque WordPress XSS est une attaque où un mauvais acteur est capable d'injecter du code dans l'expérience de votre visiteur à votre insu ou sans votre approbation. Cela est dangereux car JavaScript est une partie de plus en plus puissante et importante des sites Web et des applications Web. En raison de la quantité de données disponibles pour un attaquant qui réussit une attaque XSS, vous devez faire très attention de faire tout votre possible pour l'empêcher.

La cause première des vulnérabilités de script intersite, comme la plupart de ces problèmes de programmation, est de trop faire confiance à la source de vos données. Du point de vue d'une personne rationnelle et gentille, il est facile de penser que si vous avez un champ "Nom", les seules choses que vous obtiendrez dans ce champ ressemblent à des noms humains. Mais faites cette supposition à vos risques et périls. Du point de vue de la sécurité, vous devez être un peu paranoïaque: supposez qu'un humain ou un bot offrira que son nom est et assurez-vous qu'il ne se passe rien de mal dans votre application s'ils le font. Une fenêtre JavaScript aléatoire indiquant «XSS» concerne la version la plus inoffensive de ce type d'attaque.

Les alertes aléatoires indésirables ne sont pas géniales; ils sont assez ennuyeux et vous feront presque certainement sentir que votre site a été "piraté" si vous ne les connaissez pas. Mais ce n'est pas la pire chose qui puisse arriver dans une attaque XSS – le vol de cookies, l'espionnage de données, les transferts forcés indésirables et les remplacements de liens sur la page sont également très faciles à exécuter si vous êtes en mesure de réussir une attaque XSS sur un site Web.

Le genre d'attaques WordPress XSS

Il existe généralement deux types d'attaques WordPress XSS: celles que votre serveur Web aide à attaquer et celles qui ne le font pas. Techniquement, cela se décompose en trois classes: les attaques XSS stockées, réfléchies et basées sur DOM.

Script intersite stocké (persistant)

Une attaque de script intersite stockée (ou persistante) est à mon avis la pire. La raison pour laquelle c'est mauvais, c'est que chaque fois qu'une page est chargée sur votre site, vous courez le risque réel que la mauvaise chose que l'attaquant ait faite soit servie à chaque visiteur de votre site. Dans une attaque stockée, votre serveur Web a accepté avec plaisir les données qui incluent une attaque WordPress XSS, puis montre ce code d'attaque à tout le monde. Un exemple de vulnérabilité XSS stockée: dans le passé, certains CMS permettaient aux utilisateurs d'ajouter du JavaScript aux commentaires sur les sites Web. Lorsque cela est autorisé, chaque visiteur auquel le commentaire contenant le JS est affiché sera victime de l'attaque XSS. Chaque. Célibataire. Une.

Reflected XSS utilise également votre serveur

L'implication de votre serveur dans l'attaque XSS stockée est reflétée par celle d'une attaque de script intersite réfléchie. Les deux impliquent votre serveur, mais une attaque réfléchie se différencie en n'y étant pas stockée. Au contraire, une attaque XSS réfléchie existe lorsque votre serveur ne prend pas l'entrée d'un utilisateur et la nettoie et la sécurise de manière adéquate avant de montrer cette entrée.

Un exemple, sur un site WordPress (auquel très peu de personnes devraient être sensibles) est lorsqu'un terme de recherche contient . Lorsque votre site (thème, principalement) n'est pas protégé, vous verrez en fait une fenêtre contextuelle JavaScript du site sur la page. (Cela ne se produit pas ici sur WPShout, vous tomberez en panne avec une couche de protection de sécurité que nous avons.)

Les attaques XSS basées sur DOM ne sont pas notre priorité

Le dernier type d'attaque de script intersite est basé sur DOM. C'est en quelque sorte le moins pertinent pour la plupart des sites WordPress, car il fait le moins pour impliquer un site WordPress. Une attaque XSS basée sur DOM ne passera pas par votre serveur, ce qui la différencie des attaques stockées et réfléchies. En pratique, les attaques XSS basées sur DOM ne sont pertinentes que lorsque vous écrivez JavaScript pour des sites WordPress. Parce que ce n'est pas une méthodologie courante (bien qu'elle le soit de plus en plus), nous allons passer très peu de temps à en parler. Je recommande chaleureusement l'article et la feuille de triche de prévention de l'OWASP pour ceux qui souhaitent en savoir plus sur ce sujet.

Les mêmes méthodes (validation, nettoyage et échappement) empêchent les trois types d'attaques XSS. Aujourd'hui, nous nous concentrerons sur les mesures préventives spécifiques à WordPress, qui sont généralement des fonctions PHP personnalisées fournies par WordPress pour se protéger contre les attaques réfléchies et persistantes. Les concepts que nous couvrons lors de la protection de cette manière sont également très pertinents dans un espace d'attaque basé sur DOM, mais les mesures préventives sont uniquement JavaScript.

Il existe deux grandes façons de prévenir une attaque de script intersite: rendre les données correctes et sécuriser les données erronées.

Il existe deux grandes façons d'empêcher une attaque de script intersite: assurez-vous que toutes les données que vous acceptez correspondent à vos attentes et assurez-vous que le code qui constituerait une attaque XSS est présenté à vos visiteurs d'une manière qui ne le permet pas. éxécuter.

S'assurer que les données correspondent à vos attentes a généralement deux côtés: valider à un utilisateur qu'il a donné ce que vous lui avez demandé et désinfecter ce qu'il vous donne avant de le stocker au cas où il ne vous écouterait pas ou contournez votre validation. La désinfection consiste à nettoyer une valeur, la validation consiste à dire à un utilisateur qu'une valeur n'est pas celle que vous attendez et à l'inviter à apporter des modifications. Si quelqu'un vous donne comme leur âge, vous pouvez valider cette valeur en leur disant que ce n'est pas une valeur valide. Vous pouvez désinfecter cette valeur simplement en la faisant entrer dans l'âge de «1». Soit fonctionne, et les deux valent mieux qu'un seul. En général, je dirais que vous êtes plus en sécurité avec une valeur filtrée qu’une simple valeur validée.

Mais si votre validation ou désinfection s'avère insuffisante, il est préférable de vous assurer également que vous échappez à cette valeur d'âge avant de la montrer à votre visiteur. Le résultat le plus courant d'un tel effort serait que vous montriez à cet utilisateur son âge (si vous ne l'empêchiez pas de soumettre la chose que vous ne vouliez pas) comme . Cela se produira car vous aurez échappé à la valeur HTML et converti les signes supérieur à et inférieur à en des choses qui empêchent le navigateur d'essayer d'exécuter le JavaScript contenu à l'intérieur. Cela s'échappe.

La validation consiste à s'assurer qu'une valeur correspond à ce que vous attendez. En règle générale, vous validerez afin de permettre à l'utilisateur de soumettre à nouveau sa demande lorsque la validation échoue.

En règle générale, vous validerez afin de permettre à l'utilisateur de soumettre à nouveau sa demande lorsque la validation échoue.

Pour la validation, vous pouvez utiliser le filter_var Fonction PHP, si c'est votre style. Cela ressemblera souvent à filter_var ($ _ GET['email'], FILTER_VALIDATE_EMAIL). Ces fonctions sont puissantes et présentent l'avantage distinct de fonctionner en dehors de WordPress. Vous pouvez voir tous les filtres de validation disponibles sur PHP.net. Dans tous les cas, si la fonction vous donne faux, vous savez que les données ne sont pas valides.

Les fonctions de WordPress spécifiques à la prévention des attaques XSS relèvent principalement du camp de désinfection. Mais il y en a quelques-uns qui sont spécifiquement utiles pour la validation. Peut-être que mon préféré est is_email. Il est censé faire la même chose que le filter_var vous avez utilisé le dernier paragraphe, mais il est beaucoup plus concis if (is_email ($ _ GET['email']) est plus court que ce que nous avons tapé la dernière fois et se lit beaucoup plus comme l'anglais.

La validation peut être, et se fait souvent, comme un effort JavaScript côté utilisateur. C'est génial, et il y a un certain nombre de bibliothèques JavaScript que j'ai utilisées dans le passé pour l'aider. L'inconvénient est qu'il n'y a aucune garantie de sécurité dans une bibliothèque de validation côté client. Faire une validation côté serveur est généralement une bonne idée. Et si vous ne faites pas de validation, il est nécessaire que vous fassiez du nettoyage côté serveur.

Les fonctions de nettoyage de WordPress sont souvent plus faciles à lire que les fonctions de base PHP

WordPress dispose d'une multitude de fonctions intéressantes pour nettoyer les entrées utilisateur non fiables. Si vous êtes un développeur sérieux en matière de prévention des scripts intersites, vous devez bien les connaître. Mais avant de les aborder, il est bon de savoir que PHP filter_var a également un tas de drapeaux de désinfection. Le comportement de ceux-ci est expliqué en détail dans cette page du manuel PHP. Au cœur de la plupart de ces opérations, il suffit de supprimer toutes les valeurs de ce qui est soumis qui ne sont pas du type souhaité. Donc, si vous lancez un appel de filter_var ($ val, FILTER_SANITIZE_NUMBER_INT) vous aurez toutes vos lettres et autres caractères qui ne sont pas - + 0123456789 supprimé.

Celles-ci filter_var les appels de fonction sont à la base de certaines fonctions de nettoyage de WordPress, mais les fonctions WordPress sont souvent plus faciles à lire. Ils appliquent également joliment de nombreuses conventions WordPress communes pour vous. Une liste rapide, avec une explication modeste de chacun, suit. D'abord les plus courants:

  • sanitize_email - Supprime tous les caractères ne figurant pas dans un e-mail.
  • sanitize_file_name - Nettoie un nom de fichier, comme August_Reports.txt.
  • sanitize_html_class - Vérifie qu'un nom de classe HTML ne contient que des caractères valides.
  • sanitize_text_field - Un moyen pratique de nettoyer les champs de texte du formulaire de base.
  • sanitize_textarea_field - Comme sanitize_text_field, mais en préservant les nouveaux caractères de ligne.
  • esc_url_raw - Mal nommé, mais nettoie les URL avant de les stocker ou de les utiliser pour récupérer des données.
  • sanitize_option - Une fonction de nettoyage basée sur certaines règles; qui vous offre également la possibilité de définir vos propres règles en utilisant du code comme add_filter ('sanitize_option_my_id_option', 'intval'); que WordPress appellera toujours avant d'enregistrer l'option (car il appelle toujours sanitize_option avant de sauvegarder.
  • sanitize_meta - Un système basé sur le hook pour nettoyer les méta-valeurs en fonction des règles que vous définissez. Semblable à sanitize_option.
  • wp_kses - Supprimez le balisage HTML inacceptable d'une chaîne - vous fournissez des balises HTML acceptables comme deuxième argument. (KSES est un acronyme récursif qui signifie «KSES Strips Evil Scripts».)

Et les moins utilisés:

Fondamentalement, sanitize_title applique un filtre du même nom, auquel WordPress ajoute sanitize_title_with_dashes par défaut.

Et puis sanitize_title_for_query appelle simplement sanitize_title avec $ context = "query"

Toutes ces fonctions sont d'une certaine utilité et peuvent vous être utiles à un moment donné lors de la désinfection de vos données dans WordPress. L'essentiel à garder à l'esprit en matière de désinfection est qu'il n'y a pas de réel inconvénient. Des choses comme sanitize_option sont parfaits pour désinfecter une valeur à chaque fois que vous la récupérez avec get_option. Ces multiples exécutions de votre fonction de nettoyage peuvent sembler un peu inutiles, mais elles garantissent également que vos valeurs ne contiennent pas de code hostile.

C'est également une excellente idée d'intégrer la désinfection de vos valeurs dans votre processus de récupération et de configuration. Si vous vous assurez que vous utilisez toujours get_user_age ou une fonction de ce type, et cette fonction garantit que la valeur qu'elle renvoie est du type qu'elle implique, vous aurez une énorme couche de sécurité supplémentaire bénéfique dans votre système.

L'échappement diffère de la désinfection (parfois appelée filtrage) d'une manière très importante: il ne supprime pas les caractères, il les rend simplement plus sûrs pour vous. La différence ici est à la fois subtile et profonde. Ce que cela signifie, au fond, c'est que là où désinfecter un âge de 1 donnerait une valeur de 1 y échapper (selon le contexte) donne quelque chose comme 1. Ce dernier a la même apparence pour un visiteur, mais n'est pas exécuté accidentellement par un navigateur. Ceci est donc largement préférable.

Rappelez-vous, bien que l'échappement puisse sécuriser la plupart des données dans WordPress, cela devrait toujours être votre deuxième ligne de défense.

Rappelez-vous, bien que l'échappement puisse sécuriser la plupart des données dans WordPress, cela devrait toujours être votre deuxième ligne de défense. (La «sécurité en couches» est une excellente pratique, et c'est la raison pour laquelle vous devez toujours faire à la fois la validation / nettoyage et l'échappement.) Ce qui se passe lorsque vous vous échappez correctement est que votre document HTML est très sûr et très bien formé. La difficulté de l'échappement est que la bonne façon d'échapper au contenu dépend beaucoup du contexte.

La façon dont vous vous assurez qu'une valeur peut être affichée en toute sécurité au milieu d'une page HTML est différente de la façon dont vous vous assurez qu'elle est sûre pour l'intérieur d'une déclaration d'attribut HTML ou d'une URL.

WordPress propose cinq fonctions d'échappement de base. Elles sont:

  • esc_html - Utilisé pour protéger de gros blocs de contenu HTML
  • esc_url - Vérifie et nettoie une URL
  • esc_js - Permet d'échapper la chaîne de texte en opération JavaScript. Je le trouve ésotérique et je ne l'ai jamais vraiment utilisé.
  • esc_attr - Ce dont vous avez besoin pour les attributs HTML - comme entrer dans un Titre ou attribut d'élément similaire
  • esc_textarea - Pour les valeurs entrant dans une zone de texte en HTML

Il existe différentes alternatives qui existent en PHP pur, mais que vous pouvez utiliser à l'intérieur de WordPress. Je préférerais généralement les fonctions WordPress - elles sont mieux nommées et donc plus faciles, mais des choses comme PHP htmlspecialchars travailler et peut être utilisé. Je trouve juste que esc_html est moins à taper et précise mon intention et ce qui va se passer.

Une autre chose à propos de l'évasion: vous voulez généralement le faire à la dernière seconde possible. Il y a des raisons pour lesquelles vous ne pourrez peut-être pas, mais en général, vous échapper à la dernière seconde possible est préférable parce que (1) vous ne gênez pas votre autre programmation avec des problèmes d'échappement, et (2) vous n'avez pas à vous soucier d'une autre opération de programmation interrompant votre fuite. (Certaines personnes donnent des conseils similaires - mais opposés - sur la désinfection - faites-le dès que possible - ce qui est un bon conseil pour la même raison fondamentale.)

Comme mentionné au début, une enquête récente que j'ai effectuée sur les vulnérabilités de sécurité à l'intérieur de l'écosystème WordPress a révélé que (par une petite marge) les scripts intersites étaient la vulnérabilité la plus courante. En tant que développeur, il est essentiel de comprendre ce qu'est XSS et comment vous pouvez l'empêcher afin de sécuriser votre site pour vous et vos visiteurs.

Mais il y a plus que XSS qui compte pour la sécurité.

Mais il y a plus que des attaques WordPress XSS qui comptent pour la sécurité. Nous en avons déjà parlé en partie, vous en avez entendu parler dans WordCamps et dans des articles de blog. Mais certains sont difficiles à comprendre et difficiles à penser clairement.

C’est pourquoi je travaille dur depuis plusieurs mois sur mon nouveau cours, Sécurité WordPress en toute confianceet ont remanié l'énorme guide de sécurité WordPress de WPShout.

Sécurité WordPress en toute confiance est votre guide complet pour naviguer dans le monde déroutant, effrayant et exceptionnellement important de la sécurité WordPress. Le cours comprend plus de 10 chapitres (avec des didacticiels vidéo), est disponible en versions développeur et non développeur, et vous donne toutes les connaissances dont vous avez besoin pour gérer la sécurité WordPress, en toute confiance. Regarde!

Maintenant, allez-y et empêchez l'exécution indésirable de JavaScript!

[ad_2]