standard

Anti CSRF
Comment se prémunir de la faille CSRF sous WordPress

banner_anti-csrf
Anti CSRF

Add a security layer on your site: avoid bad crafted plugin harm your site now because fo CSRF flaw!

Add a security layer on your site: avoid bad crafted plugin harm your site now because fo CSRF flaw!
  1. Extract the plugin folder from the downloaded ZIP file.
  2. Upload BAW Anti CSRF folder to your /wp-content/plugins/ directory.
  3. Activate the plugin from the "Plugins" page in your Dashboard.
  4. That's all
  1. baw-anti-csrf screenshot 1

    On update page, clic MY link or die. ;)

  2. baw-anti-csrf screenshot 2

    Example of my own die with support proposal ;)

1.2

11 sep 2012 * Add more security using a message between a link without token, more annoying i admit, but more secure.

1.1.5

  • 16 aug 2012
  • Bug fix for Redirection (bad JS on my side x2)

1.1.4

  • 13 aug 2012
  • Bug fix for Jetpack (bad JS on my side)

1.1.3

  • 13 aug 2012
  • Bug fix for some link without my nonce

1.1.2

  • 13 aug 2012
  • Bug fix for l10n load

1.1.1

  • 13 aug 2012
  • Not a big deal, just forgot to add the plugin version in die support.

1.1

  • 12 aug 2012
  • Bug fix on redirection with wp_redirect()
  • Better own wp_die to explain and give support
  • Use my own nonces functions (clone from WP core) to avoid malicious plugins that can bypass mine

1.0.1

  • 12 aug 2012
  • Bug fix for default code ajax actions

1.0

  • 12 aug 2012
  • First Release

0.1b, 0.2b, 0.3b

  • 3 betas versions tested by @rochdaniel, @screenfeedfr, @gcroupie, @tmaquet, @geekpressfr, thanks dudes !

= Why do i have to link on your link when i'm on an update page ? * Because i'm using a buffer to modify each form and action link, but WordPress clear this buffer before me on this page :( The link is just a Dashboard link.

A vos souhaits !

Anti CSRF ? Ha, la faille CSRF !... Vous connaissez sous WordPress ? Il s'agit (en gros) du fait qu'une personne mal intentionnée puisse utiliser le compte d'une personne ayant des droits pour réaliser des actions qu'elle n'aurait pas le droit de faire. (c'est bon, respirez ...)

Démo rapide de Anti CSRF

Imaginons que dans un plugin WordPress se trouvent des liens de ce genre :

http://www.example.com/wp-admin/admin.php?page=le-plugin&action=delete&id=123

Ce lien supprime par exemple une entrée d'options du plugin en question. WordPress étant bien fait, une personne n'ayant pas les droits ne pourra pas accéder à cette page car la page "admin.php" refusera, ici pas de faille.

Si un admin (ou autre personne ayant les droits d'utiliser ce lien) utilise/clic sur ce lien, l'action sera elle, bien faite.

Même chose pour les formulaires :

Activer le plugin : Entrez votre ID machin :

Ici au clic sur "Sauver", le plugin sera activé ou non, selon la coche, et un ID sera sauvegardé. Même chose que précédemment, seul une personne ayant les droits d'accès à cette page pourra valider ce formulaire et personne d'autre.

Alors où est le problème ?

Il ne se voit pas à premier abord, mais il est bien là ! Et si moi, vile utilisateur de votre site, vous envoie ce lien caché dans un bit.ly ? Et bien, VOUS, l'admin, exécuterez cette action, car VOUS en avez les droits, mais VOUS n'en aviez pas la volonté ! Trop tard ...

Pour le formulaire, il vous envoi un lien vers une page qui contient le même formulaire attendu par le plugin, avec "action=http://www.example.com/wp-admin/admin.php?page=le-plugin", et cette page envoie de façon discrète (je ne vais pas citer les solutions, mais il en existe plusieurs), même chose, VOUS, l'admin, exécuterez cette action, car VOUS en avez les droits, mais VOUS n'en aviez pas la volonté ! Trop tard aussi ...

C'est grave docteur ?

Euh, parfois, j'avoue que ce n'est pas très grave, si l'action ne fait que modifier un titre de widget, ou désactive le plugin, ce n'est pas très grave, juste ennuyeux à force. Là où ça devient grave c'est si la CSRF est couplé à une XSS (80% des cas), le combo permet de faire des choses énormes, comme le vol des cookies de l'admin, la modifications de contenu du site, la redirection de votre site vers des sites de virus (merci le SEO) ... J'en passe !

Mais pourquoi ! Comment !?

Doucement, je vais quand même donner des solutions, on est pas là pour papoter !

Le tout est de s'assurer que l'action a été réalisée non pas juste par un compte ayant les droits mais aussi réellement par la personne elle même et volontairement.

Pour cela il faut utiliser ce qu'on apelle un "jeton de sécurité" ou "security token". On dit aussi un "nonce" qui signifie "number once" (number used once) qui veut dire "chiffre utilisé une seule fois".

WordPress là aussi est bien fait et a tout ce qu'il faut pour les gérer, les créer, les vérifier, dans le codex : WordPress Nonces

Encore faut-il les utiliser et suivre les recommandations WordPress (qui découlent de recommandations PHP qui découlent de recommandations d'experts en sécurité ...)

Sachez que 40% des plugins, toutes provenances confondues (repository officiel, sites persos, offres premium) contiennent une faille CSRF, oui 40% c'est beaucoup.

Anti CSRF en action

Anti CSRF en action

Comment s'en prémunir (sous WordPress) avec Anti CSRF

Je ne vais pas copier/coller le codex, je vous laisse le lire, mais comme on vous a toujours appris à ne pas modifier les plugins car vous perdriez les modifs lors des prochaines mises à jour, vous ne devez pas ajouter vous même les nonces sur les plugins dont vous aurez détecté la faille.

Donc en plus de prévenir l'auteur (sur la page Support du plugin ,ou par mail à l'auteur, ou contactez moi) vous ne pouvez plus l'utiliser ? SI ! C'est là où j'interviens (genre je suis un sauveur de l'humanité à la sauce WordPress) en mettant mon grain de sel (dans la sauce...) avec ce plugin que je vous propose : Anti CSRF.

Anti CSRF va ajouter dans TOUS les formulaires créés par des plugins, un nonce de plus, et aussi chaque lien pouvant appartenir à un plugin se voit ajouter un nonce. Vous remarquerez que vos liens sur les pages d'options des plugins ont le paramètre "bawac_force_nonce" en plus.

Anti CSRF va vérifier que son propre nonce est valide et réaliser l'action ou la bloquer. Le plugin fonctionne aussi sur les requêtes ajax en injectant avant l'envoie son propre nonce (le même).

Anti CSRF bloque une URL

Anti CSRF bloque une URL

J'ai testé ce plugin sur plusieurs plugins vulnérable et  comme attendu, la faille est bouchée !! Merci Anti CSRF !

Oui mais, je suis dev, comment m'en prémunir  ?

Ha, vous voulez tout de même savoir comment on utilise les nonces WordPress, allez je fais un effort, voici quelques exemples :

Comment créer un nonce correct :

Pour WordPress un nonce est une chaîne de caractère de 10 de long qui est en fait un morceau du hash de votre user ID, du tick time des 12 heures en cours, d'une action et du mot "nonce". L'action par défaut est "-1", vous pouvez la remplacer par ce que vous voulez, je préconise d'utiliser une action "à la WP" comme ceci :

$action-$object_$uniq_id

Ici on pourrait dire "delete-item_123", un nonce doit autant que possible être unique pour chaque lien/formulaire/page. Il est impossible de deviner, recréer un nonce pour un autre utilisateur mais un nonce non unique peut être exploité d'une autre façon (ceci est un autre sujet). Evitez d'utiliser __FILE__, vous aurez un jour des problèmes si le nonce passe d'une page à une autre et ce n'est ni parlant ni clair ni simple à maintenir.

Quelques fonctions et pour qui/quand :

Ajouter un nonce dans une url : wp_nonce_url()
vérifier un nonce venant d'une url : wp_verify_nonce()
Ajouter un nonce dans un formulaire : wp_nonce_field()
Vérifier un nonce venant d'un formulaire : check_admin_referer()
Créer un nonce pour créer soit meme son URL ou son champ ou dans une variable JS (pour Ajax) : wp_create_nonce()
Vérifier un nonce venant d'ajax : check_ajax_referer()

Et Anti CSRF alors !

Oui quand même, cet article est là pour mettre en avant le plugin. Alors pourquoi installer ce plugin ? QUOI ! Vous vous posez encore la question ! Tout simplement que le plugin bouche la faille des plugins mal construits, provocants une faille CSRF. Aucune page d'option, installer, activer, terminé. Toute installation de WordPress qui installe des plugins se DOIT de se protéger de ce type d'attaques ... 40% des plugins ...
Au fait, le plugin en fonctionne "que" dans l'administration.

Lire la suite

Vous aimez ? Partagez !

À propos de Julio Potier

Consultant en Sécurité & Expert WordPress, je développe et sécurise du contenu web tous les jours. La création de plugins WordPress fait partie de mon quotidien. Mon livre de chevet ? Le codex WordPress bien sur !

Commentaires

  1. Bonjour,

    C’est vraiment bien, et les explications sont utiles et très claires. Je vais de mon côté le proposer avec le lien de cette page.

    Bien à toi,

    Patrick

  2. Que je ne dise pas de bêtises: c’est une faille qui nécessite d’avoir d’autres membres que l’admin sur le site ?

    • AuteurJulio Potier a écrit:

      Bêtise ! Il suffit que le site contienne des rangs ou tout au moins des comptes ayant des droits différents. Le fait d’avoir des autres membres avec des rangs différents en fait donc aussi parti.
      WordPress ne contient pas de CSRF (connues à ce jour) mais les plugins … oui :/

  3. D’accord. Donc s’il n’y a que l’admin et personne d’autre, on peut se passer du plugin ?

    • AuteurJulio Potier a écrit:

      Non tu n’y es pas du tout. Le plugin est indispensable à tout site WordPress qui installe des plugins car 70% des plugins sont vulnérables à la faille CSRF.
      La faille est déclenchée par un hacker qui n’a pas de compte et qui usurpe le compte admin VIA l’admin lui même.
      Donc, sans me la raconter ni vouloir le faire télécharger par la planète : oui, ce plugin est indispensable à toute install et je vais de ce pas le poser chez mes clients.

  4. Encore bravo pour le plugin. L’idée de base est excellente et comme il n’y a aucun paramétrage côté utilisateur, c’est du tout bon. ;)

    • AuteurJulio Potier a écrit:

      Merci ! Logiquement aucun menu de réglages n’est prévu dans ce plugin.

  5. Est-ce qu’on n’a pas un problème de « surcharge » quand un plugin utilise déjà les nonce ?
    Et si je comprends bien, dès qu’on crée un formulaire dans un plugin, il est nécessaire d’utiliser des nonce, c’est ça ? Quid du fichier functions.php des thèmes ?

    • AuteurJulio Potier a écrit:

      Nonon, même pour les plugins bien faits, j’ajoute un nonce de plus, oui, mais cela ne pose pas de problème de surcharge.
      Je vais faire un ou deux articles sur les nonces asap ;)

Envie de dire quelque chose ?

Avant de parler, merci de lire la charte des commentaires.

*

Vous pouvez utiliser le tag [php][/php] pour ajouter quelques lignes de PHP, si c'est un pavé, merci d'utiliser service comme pastebin.com.

Vous êtes humain ?
Cliquez sur les ciseaux.