Failles et vulnérabilités du Web

WPS Limit Login v1.4.5 Multiples Vulnérabilités

Blog Failles et vulnérabilités du Web WPS Limit Login v1.4.5 Multiples Vulnérabilités
0 commentaire

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 :

$wps_limit_login_white_list_ips = $this->get_option( 'wps_qlimit_login_whitelist' );
$wps_limit_login_white_list_ips = ( is_array( $wps_limit_login_white_list_ips ) && ! empty( $wps_limit_login_white_list_ips ) ) ? implode( "\n", $wps_limit_login_white_list_ips ) : '';

…

<?php echo $wps_limit_login_white_list_ips; ?>

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

0 commentaire