Gravatar couramment utilisé Blog perso de Paul Da Silva

Je me suis fait pirater – lol !

Posted on | mai 19, 2011 | 17 Comments

A force de déceler des failles à droite à gauche (je n’en poste que très peu ici finalement par rapport à tout ce que je peux détecter…) ça devait arriver : I got hacked !

Je vais donc en profiter pour vous expliquer comment l’attaquant, @BoiteAWeb, s’y est pris, comment j’ai réagi et corrigé.

Version courte, @BoiteAWeb a utilisé un CSRF présent dans l’extension lightbox2 pour WordPress et injecté un XSS persistant qui mettait en place une iframe de hadopi.fr sur mon blog. Ce site ayant un script empêchant la mise en iframe, toute personne visitant mon blog était automatiquement redirigée vers hadopi.fr – Bien joué l’artiste, j’ai beaucoup ri !

Me supposant connecté à l’administration de mon blog il m’a invité, via Twitter à visiter son site. Sur celui-ci était présent le code suivant :

Pour les plus néophytes d’entre vous, le code créé un formulaire qui va se soumettre tout seul et répondre à la page de configuration de l’extension pour y changer la valeur lightbox_2_theme par la valeur « ><iframe src=http://hadopi.fr height=1500 width=1900></iframe><a a= »

Ceci ayant pour effet de stocker cette valeur comme thème à utiliser dans les options de l’extension on se retrouvait avec le code source suivant (j’ai ajouté des retours à la ligne pour la lisibilité) pour tous les utilisateurs visitant mon blog :

Résultat : une belle iframe Hadopi et une redirection vers le site en question… Oups !

Passé un gros fou-rire j’ai demandé à @BoiteAWeb dans quoi il avait injecté son XSS persistant et vu qu’il n’était plus devant son ordi ai du investiguer moi-même. Ayant constaté qu’il s’agissait d’une redirection javascript je l’ai désactivé et ai regardé la source de mon blog. En cherchant « hadopi.fr » dans le source j’ai rapidement constaté que cela venait de l’extension lightbox2 que j’ai désactivé le temps de la patcher.

Je me suis ensuite penché sur les infos stockées en base de données pour trouver que c’était la variable lightbox_2_theme qui avait été modifiée.

Dans le source de l’extension (qui n’est plus maintenue) j’ai vite compris le problème : il n’y a aucune protection anti-CSRF sur l’administration et la variable de thème est affichée sans aucune vérification ou assainissement.

J’ai donc rajouté les deux comme ceci :

Dans le fichier lightbox2.php, chercher la ligne suivante :

document.write(‘<link rel=\ »stylesheet\ » href=\ » ».$lightbox_style. »lightbox.css\ » type=\ »text/css\ » media=\ »screen\ » />’);

Et remplacer par :

document.write(‘<link rel=\ »stylesheet\ » href=\ » ».esc_html($lightbox_style). »lightbox.css\ » type=\ »text/css\ » media=\ »screen\ » />’);

Dans le fichier options.php, chercher la ligne suivante :

if (‘process’ == $_POST[‘stage’]){

Et remplacer par :

if (‘process’ == $_POST[‘stage’] && preg_match(‘`^[a-z ]+$`i’, $_POST[‘lightbox_2_theme’]) && is_dir(get_option(‘lightbox_2_theme_path’).’/’. $_POST[‘lightbox_2_theme’])) {

Pour être un peu plus complet on peut aussi changer la valeur de $_POST[‘stage’] par une valeur personnelle et faire de même dans le formulaire. Ainsi pour forger une requête il faudra que l’attaquant connaisse la valeur que vous aurez choisi… Ou essaye par bruteforce par exemple.

Une fois toutes les modifications apportées j’ai réactivé l’extension et remis le thème à White, ce qui a eu pour effet d’enlever le XSS persistant.

Grâce à @BoiteAWeb j’ai maintenant un site un peu plus sécurisé (il va falloir que j’audite le reste des extensions que j’utilise du coup !) et cela a surtout évité qu’une personne moins bien intentionnée s’en prenne à cette vulnérabilité et s’en serve pour commettre des actes de terrorisme numérique !

Je lui dédie donc cet article, un grand merci et, dès qu’il sera publié, je lui enverrai Piratons la démocratie !

Commentaires

17 Responses to “Je me suis fait pirater – lol !”

  1. taziden
    mai 19th, 2011 @ 13 h 46 min

    Ce serait pas mal de faire remonter la correction à l’auteur de l’extension, non, qu’en penses-tu ?

  2. Paul
    mai 19th, 2011 @ 13 h 47 min

    Il ne maintient plus son extension et la correction apportée ici n’est pas la meilleure, n’étant pas expert WordPress j’ai patché au mieux en attendant d’avoir le temps de me plonger dans la doc WP.

  3. BoiteaWeb
    mai 19th, 2011 @ 13 h 57 min

    Merci à toi Paul 🙂

    Je n’ai pas pour habitude d’exploiter les failles que je trouve sans l’accord de son propriétaire. Mais ayant mis 3 fois un pied dans la porte avec toi le jour même afin de « tester » ta façon de penser à ce sujet, je me suis dit « allez je lui fait façon sympa » 😉

    Après un rapide coup d’oeil sur les plugins utilisés, j’ai audité rapidement le seul plugin que je ne connaissais pas « lightbox-2 ».

    BIM une CSRF menant à une XSS. je n’ai rien à ajouter au « comment j’ai fait », Paul a déjà tout dit (trop à mon gout mais c’est son blog, c’est lui la victime, je le laisse juge de tout montrer ou non).

    Je souhaite maintenant grâce à cet article faire passer un message pour tous les possesseurs d’un WordPress(.org) :
    Les plugins sont la première porte d’entrée vers un hacking. Malheureusement, même les plugins du repository WordPress (l’extend) ne sont pas vérifiés, et avec plus de 14000 plugins … wow à qui se fier ?
    J’ai la réponse : personne :] De mon côté j’audite des plugins, quelques fois gratuitement (plugin de mon choix), d’autres non (si le plugin est payant : je fais payer).
    J’ai réalisé un plugin 100% secure (lui) qui est capable de vous indiquer si le plugin est secure ou pas. Il s’agit de WPSC (http://wordpress.org/extend/plugins/baw-wordpress-plugin-security-checker/).
    Malheureusement, le nombre de plugin audité est loin des 14000 dispo.
    Courant juillet ce plugin passera en v2.0 et il y aura plus d’audits, vous aurez la possibilité de faire la demande d’audits (sans prix, un don est apprécié néanmoins).

    Je vous recommande dans tous les cas de vous tenir à jour sur 100% de vos plugins, de supprimer (pas juste désactiver) ceux que vous n’utilisez pas, et si vous doutez de la sécurité de l’un d’entre eux, contactez un professionnel sur le sujet (/me lève la main).

    Autre conseil d’ami : ne divulguez pas la liste de vos plugins, jamais, déjà que même sans ça, on peut en trouver (je vous invite à tester ce service http://secu.boiteaweb.fr/services/wordindisc/ vous en serez étonné et/ou dégoutés.

    Pour finir sachez que j’ai repris le plugin et suis en train d’en faire une v3.0, elle sort demain si tout va bien. Elle corrige évidemment les 2 failles, le code a été refondu et amélioré.

    Bonne route à tous !

    Julio – Consultant en Sécurité Web – Spécialisé WordPress
    Blog Sécurité WordPress – http://blog.boiteaweb.fr
    Site pro Sécurité Web – http://secu.boiteaweb.fr

  4. Siriru
    mai 19th, 2011 @ 14 h 01 min

    Si elle n’est plus maintenue ça ne sert plus à grand chose. À moins que ça le motive au contraire.

  5. Daniel Roch
    mai 19th, 2011 @ 14 h 17 min

    Excellent cas pratique du problème posé par la sécurisation trop faible ou inexistante d’un grand nombre de plugins WordPress.

    Et je ne peux qu’approuver le commentaire de BoiteAWeb : ce n’est pas parce que l’on trouve un plugin sur le site officiel de WordPress que celui-ci est sécurisé (ou qu’il est utile…).

  6. karimus
    mai 19th, 2011 @ 14 h 22 min

    Sympa 🙂
    rare de voir des dev/seo parler de sécurité :p

    A remonter sur exploit-db en tout cas !

  7. Winael
    mai 19th, 2011 @ 15 h 36 min

    Bon ben maintenant reste à savoir si les webmaster des blogs WP des gentils gens pro Hadopi qui utilisent cette extension vont eux aussi la patcher rapidement…

  8. bzhmaddog
    mai 19th, 2011 @ 17 h 52 min

    c’est quand même très ciblé comme attaque. Il faut connaitre le responsable du site pour l’inciter à visiter le sien.

    Mais en tout cas ça me rassure je fais bien de ne pas utiliser le même browser pour surfer et pour éditer mon blog :p

  9. alex
    mai 19th, 2011 @ 19 h 51 min

    Ah, une csrf classique !
    Félicitations à Julio d’avoir repris le développement de ce plugin et aussi pour son excellent comméntaire; sauf peut-être la partie où il dit que sont plugin est 100% sûr ! J’imagine qu’il n’a jamais testé son plugin sur un WP multisite (ouais, le plugin n’est peut-être pas censé pour ce type de sites, mais ca rend fausse son affirmation). 🙂

  10. BoiteaWeb
    mai 19th, 2011 @ 21 h 51 min

    @bzhmaddog : C’est ciblé CAR c’est une attaque. Et non, pas obligé de connaitre le responsable, la preuve, je ne le connais pas Paul. On s’est parlé hier sur twitter, il a RT un de mes tweets et je ai exploit une faille sur son site.
    Combien de fois cliques-tu sur des liens bit.ly, goo.gl sans connaitre l’arrivée d’arrivée ? Qui ne cliquerait pas sur un lien twitter du genre « NAN ! Trop excellent, j’en veux ! http://superurl.quitue.com #lol »

    Et oui, tu peux utiliser le même navigateur pour surfer ET éditer ton blog. Cependant il faut séparer « Auteur » et « Admin ». L’auteur ne pourra que poster des articles, et pas modifier les plugins etc 😉

    @alex : CSRF classique qui reste la faille la plus répandue sur le net de nos jours… Il est vrai que je ne l’ai pas testé sur un MS, peux tu m’indiquer ce que ça change niveau sécu/code du plugin ? Je ne comprends pas bien 😮 Merci

  11. alex
    mai 20th, 2011 @ 0 h 49 min

    Ben je n’ai pas trop regardé ton code, mais il me semble que tu ne valides pas que la valeur de ta clé API a le format adéquat, ce qui permettrait de faire du XSS. Il ne faut jamais assumer que les valeurs provenant de la BD sont sûrs !
    J’ai trouvé ce type d’erreurs il y a longtemps dans le core. La version 3.1.3 va d’ailleurs en corriger aussi quelques uns.

  12. BoiteaWeb
    mai 20th, 2011 @ 7 h 43 min

    Oui c’est vrai que je ne sanitize pas et qu’une XSS est possible dans ce champ. Par contre, étant donné qu’il faut être admin pour pouvoir insérer cette clé, je me dit que si l’admin souhaite s’auto XSSer, c’est sa vie x)
    Allez, j’ajoute un sanitize_key() pour la v2.0, rien d’urgent.
    Tout ce qui s’affiche venant de l’ajax linké sur mon site est totalement secure, je ne fais pas de « echo » des données venant de mon site. Trop facile de balancer de belles infos au début puis de hack tout le monde d’un coup ensuite ;o
    Merci encore

  13. alex
    mai 20th, 2011 @ 9 h 04 min

    Dans un WP multisite, presque tous les utilisateurs ont le rôle administrateur ! C’est pour ca que j’avais mentionné ce cas là 😉

  14. BoiteaWeb
    mai 21st, 2011 @ 0 h 12 min

    Ha super ça -_- Je vais trouver quelqu’un avec un MS pour tester alors ;|
    Merciiii

  15. 512banque
    janvier 29th, 2012 @ 2 h 49 min

    J’ai découvert cet article 8 mois après sa parution, et immédiatement je me suis demandé s’il existait un risque réel…

  16. Meilleurs plugins WordPress : la crème de la crème - Blogueur Marketeur
    juillet 7th, 2013 @ 1 h 28 min

    […] La faille CSRF est dangereuse et extrêmement répandue : d’après l’auteur du plugin, 70% des plugins et thèmes y sont vulnérables (!). L’auteur a utilisé cette faille à titre de démonstration pour faire une blague à un collègue, et son récit est un excellent exemple de ce qu’elle permet de faire. […]

  17. Blogueur Marketeur – Meilleurs plugins WordPress : la crème de la crème
    juillet 7th, 2013 @ 17 h 46 min

    […] La faille CSRF est dangereuse et extrêmement répandue : d’après l’auteur du plugin, 70% des plugins et thèmes y sont vulnérables (!). L’auteur a utilisé cette faille à titre de démonstration pour faire une blague à un collègue, et son récit est un excellent exemple de ce qu’elle permet de faire. […]

Leave a Reply





Edito

Ancien journaliste, ancien entrepreneur, ancien (ir)responsable Pirate, actuel citoyen qui s'intéresse à la politique et à son évolution.

Read moar !.

Retrouvez moi sur :

Suivez moi sur twitter sur facebook sur wikipedia Ajouter ce blog a votre lecteur RSS

Bitcoin

bitcoin logo
1GZnMQ9wXyifxCnDEqg8CSGdngWcKWptHv

Piratons la démocratie

piratons la democratie

One more thing !

0100 0011 0110 1000 0110 0001 0110 1110 0110 0111 0110 0101 0111 0010 0010 0000 0110 1100 0110 0101 0010 0000 0110 1101 0110 1111 0110 1110 0110 0100 0110 0101 0010 0000 0110 0101 0110 1110 0010 0000 0111 0011 0010 0111 0110 0001 0110 1101 0111 0101 0111 0011 0110 0001 0110 1110 0111 0100 0010 0000 0010 1101 0010 0000 0110 1111 0110 1110 0010 0000 0111 0110 0110 0001 0010 0000 0110 0010 0110 1111 0110 1001 0111 0010 0110 0101 0010 0000 0111 0101 0110 1110 0010 0000 0110 0011 0110 1111 0111 0101 0111 0000 0010 0000 0011 1111

Tm9uIGNlbGVsIGzgIGVzdCBqdXN0ZSBwb3VyIHRlIGZhaXJlIHBlcmRyZSA1bW4gOyk=

Relationship Closeness Inventory

Promo code Genesis Mining

Sha 256 cloud mining

Best Bitcoin debit card

Zcash Mining