Aujourd’hui, Karim El Ouerghemmi a divulgué une faille critique dans WordPress permettant à n’importe quel auteur, éditeur ou administrateur de supprimer n’importe quel fichier d’une installation, dans n’importe quel dossier, sans aucun outil.
En moins de 1 minute, un site peut être détruit. La faille est connue de l’équipe de sécurité de WordPress depuis environ 7 mois mais toujours aucun correctif n’a été publié, voilà pourquoi Karim l’a révélée.
Pourquoi la révéler si c’est critique ?
La réponse est dans la question : car c’est critique et si un consultant en sécurité peut la trouver, un pirate aussi peut. Nous (moi, vous) devons informer tout le monde de cette vulnérabilité pour montrer à tous que c’est facile de pirater un site WordPress si vous avez un authur/éditeur/admin (autre que vous) sur votre site.
Où est la faille ?
La fonction wp_delete_attachment()
est coupable ici :
[pastacode lang=”php” manual=”function%20wp_delete_attachment(%20%24post_id%2C%20%24force_delete%20%3D%20false%20)%20%7B%0A%09%E2%8B%AE%0A%09%24meta%20%3D%20wp_get_attachment_metadata(%20%24post_id%20)%3B%0A%09%E2%8B%AE%0A%09if%20(%20!%20empty(%24meta%5B’thumb’%5D)%20)%20%7B%0A%09%09%2F%2F%20Don’t%20delete%20the%20thumb%20if%20another%20attachment%20uses%20it.%0A%09%09if%20(!%20%24wpdb-%3Eget_row(%20%24wpdb-%3Eprepare(%20%22SELECT%20meta_id%20FROM%20%24wpdb-%3Epostmeta%20WHERE%20meta_key%20%3D%20’_wp_attachment_metadata’%20AND%20meta_value%20LIKE%20%25s%20AND%20post_id%20%3C%3E%20%25d%22%2C%20’%25’%20.%20%24wpdb-%3Eesc_like(%20%24meta%5B’thumb’%5D%20)%20.%20’%25’%2C%20%24post_id))%20)%20%7B%0A%09%09%09%24thumbfile%20%3D%20str_replace(basename(%24file)%2C%20%24meta%5B’thumb’%5D%2C%20%24file)%3B%0A%09%09%09%2F**%20This%20filter%20is%20documented%20in%20wp-includes%2Ffunctions.php%20*%2F%0A%09%09%09%24thumbfile%20%3D%20apply_filters(%20’wp_delete_file’%2C%20%24thumbfile%20)%3B%0A%09%09%09%40%20unlink(%20path_join(%24uploadpath%5B’basedir’%5D%2C%20%24thumbfile)%20)%3B%0A%09%09%7D%0A%09%7D%0A%09%E2%8B%AE%0A%7D” message=”” highlight=”11″ provider=”manual”/]
L’appel à unlink()
supprimera le fichier contenu dans la méta donnée nommée thumb
. Mais comment est remplie cette donnée ? Voyons ça dans /wp-admin/post.php
:
[pastacode lang=”php” manual=”%E2%8B%AE%0Aswitch(%24action)%20%7B%0A%E2%8B%AE%0A%09case%20’editattachment’%3A%0A%09%09check_admin_referer(‘update-post_’%20.%20%24post_id)%3B%0A%09%09%E2%8B%AE%0A%09%09%2F%2F%20Update%20the%20thumbnail%20filename%0A%09%09%24newmeta%20%3D%20wp_get_attachment_metadata(%20%24post_id%2C%20true%20)%3B%0A%09%09%24newmeta%5B’thumb’%5D%20%3D%20%24_POST%5B’thumb’%5D%3B%0A%0A%09%09wp_update_attachment_metadata(%20%24post_id%2C%20%24newmeta%20)%3B%0A%E2%8B%AE” message=”” highlight=”9,11″ provider=”manual”/]
La méta donnée est juste la valeur brute du champ de formulaire de l’utilisateur, aucune désinfection, aucun filtre, aucun échappement, rien.
Est-ce déjà exploitable ? Facilement ?
Malheureusement oui, en moins de 1 minute une auteur peut supprimer n’importe quel fichier du site comme wp-config.php
(un des pires non ?) mais aussi un attaquant pourrait supprimer le fichier principal d’une extension de sécurité afin qu’elle ne se charge plus pour ensuite faire des actions de piratages plus graves. Car disons le, casser un site n’a que peut d’intérêt pour un pirate, mais voler les données, si, le défacer, aussi, le casser non.
Voyons en 55 sec comment ça se passe :
Vous avez peut-être déjà regardé une autre vidéo de cet exploit, utilisant la console JavaScript pour injecter un code hexadecimal pour ajouter et appeler une nouvelle fonction JS et lancer un nouvel appel AJX etc, C’EST BIEN TROP, il suffit de changer 2 valeurs + une dernière qui sera le chemin vers le fichier à supprimer, c’est tout.
Comment sécuriser mon site maintenant ?
Si vous utilisez déjà SecuPress (version free ou pro) 1.4.5.1 ou plus, votre site est déjà sécurisé car nous avons inclus le correctif de Karim suivant (avec un nom de fonction différent afin d’éviter des conflits de code) :
[pastacode lang=”php” manual=”add_filter(%20’wp_update_attachment_metadata’%2C%20’rips_unlink_tempfix’%20)%3B%0A%0Afunction%20rips_unlink_tempfix(%20%24data%20)%20%7B%0A%20%20%20%20if(%20isset(%24data%5B’thumb’%5D)%20)%20%7B%0A%20%20%20%20%20%20%20%20%24data%5B’thumb’%5D%20%3D%20basename(%24data%5B’thumb’%5D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20%24data%3B%0A%7D” message=”” highlight=”” provider=”manual”/]
Installez SecuPress maintenant et sécurisez votre site dans la minute !