WPS Limit Login est édité par WP Serveur, hébergeur WordPress français. L’indice de criticité de cette mise à jour est moyen.
Protection ByPass
Fichier : /classes/plugin.php
Méthode : get_address()
Problème : Cette méthode va lire la variable HTTP_X_FORWARDED_FOR
qui est, comme son nom l’indique, une donnée croisée via le navigateur (HTTP X (X = Cross, Croisé)). Il me suffit alors de modifier mon header X-Forwarded-For à chaque requête pour toujours être à mon premier essai rendant ainsi l’utilisation du plugin inutile. Il est simple de le faire de façon automatique rendant donc le brute force possible si vous n’avez pas de protection comme SecuPress.
Stored XSS in admin area #1
Fichier : /blocks/log.php
Line : 69
…<?php echo $user_info['ip']; ?>…
Fichier : /classes/plugin.php
Line : 1396
echo '<p>' . date_i18n( 'd/m/Y H:i:s', $date ) . ' - ' . $user_info['ip']…
Problème : Aucun échappement ni sanitization en sortie, et comme il n’en a pas été fait non plus en entrée, on affiche ce qu’on reçoit de la part de l’IP du visiteur. Comme dit plus haut, la valeur de HTTP_X_FORWARDED_FOR
est libre de la part du navigateur et falsifiable, on peut donc y entrer ce qu’on veut, du texte, du script, etc Il est donc possible d’insérer du code JavaScript dans la page de l’administration et déclencher des actions via jQuery (donc ajax etc) qui est inclus dans ces pages.
Stored XSS in admin area #2 & #3
Fichier : /blocks/whitelist.php
Ligne 2-3 & 20 :
[pastacode lang=”php” manual=”%24wps_limit_login_white_list_ips%20%3D%20%24this-%3Eget_option(%20’wps_qlimit_login_whitelist’%20)%3B%0A%24wps_limit_login_white_list_ips%20%3D%20(%20is_array(%20%24wps_limit_login_white_list_ips%20)%20%26%26%20!%20empty(%20%24wps_limit_login_white_list_ips%20)%20)%20%3F%20implode(%20%22%5Cn%22%2C%20%24wps_limit_login_white_list_ips%20)%20%3A%20”%3B%0A%0A%E2%80%A6%0A%0A%3C%3Fphp%20echo%20%24wps_limit_login_white_list_ips%3B%20%3F%3E” message=”” highlight=”” provider=”manual”/]
Problème : Aucune sanitization ni contrôle de ce qui est entré et aucun échappement en sortie.
Actuellement il est possible d’y entrer :
dans le textarea</textarea> hors du textarea <input…>
Ceci est alors imprimé hors du champ. Ce qui va afficher mon texte et mon input, on peut bien entendu encore une fois faire pire.
CSRF
Fichier : /classes/plugin.php
Ligne : 1450
Problème : Manque un jeton de sécurité, ici je peux donner le lien suivant à un admin ou l’inclure dans une page masquée et il se déclenchera :
https://example.com/wp-admin/admin-ajax.php?action=wpslimitlogin_rated
Rien de bien grave ici mais tout de même, si ce schéma est repris pour des actions de plus en plus importantes, privées, cela deviendrait problématique, autant s’y prendre de suite avec de bonnes pratiques.
Ces failles ont été corrigées dans la v1.4.6.1