WPML est un célèbre plugin payant de multi-langues pour WordPress.
Le 31 août 2015 la version 3.2.7 corrige une faille XSS présente depuis la 2.9.3.
Le fichier touché est ajax.php
à la racine du plugin, le code en question est:
[pastacode lang=”php” message=”” highlight=”” provider=”manual” manual=”case%20’get_browser_language’%3A%0A%09%24http_accept_language%20%20%20%20%20%20%20%20%20%20%20%20%3D%20%24_SERVER%5B%20’HTTP_ACCEPT_LANGUAGE’%20%5D%3B%0A%09%24accepted_languages%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20explode(%20’%3B’%2C%20%24http_accept_language%20)%3B%0A%09%24default_accepted_language%20%20%20%20%20%20%20%3D%20%24accepted_languages%5B%200%20%5D%3B%0A%09%24default_accepted_language_codes%20%3D%20explode(%20’%2C’%2C%20%24default_accepted_language%20)%3B%0A%09echo%20wpml_mb_strtolower(%20%24default_accepted_language_codes%5B%200%20%5D%20)%3B%0Aexit%3B”/]
Le plugin va lire l’entête Accept-Language
, le découper selon les ;
, prendre le premier élément, le découper selon les ,
, prendre le premier élément et l’afficher en minuscule.
Le soucis est qu’aucun traitement n’ai fait sur cette chaîne à afficher, il est alors simple de modifier une entête de requête HTTP afin d’y insérer du code JS qui sera executé, voir du code PHP complet qui pourrait être inclus via une autre faille type LFI (Local File Inclusion – Inclusion de fichier local).
La version 3.2.7 corrige cette faille en ajoutant une désinfection (sanitize) des données à afficher.