
CVE-2020-28874
La vulnérabilité se trouve dans le composant de réinitialisation de mot de passe ; un attaquant peut modifier le mot de passe de n'importe quel utilisateur connu à partir de son nom d'utilisateur, par exemple admin, sans jeton valide.
Cela est possible car le backend ne nettoie pas la variable $user_data avec les données utilisateur chargées à partir du nom d'utilisateur fourni.
if (!empty($_GET['token']) && !empty($_GET['user'])) {
$got_token = $_GET['token'];
$got_user = $_GET['user'];
/**
* Get the user's id
*/
$user_data = get_user_by_username($got_user);
....
}
Et il utilise l'état de cette variable pour poursuivre le processus de réinitialisation du mot de passe.
if ($_POST) {
/**
* Clean the posted form values.
*/
$form_type = encode_html($_POST['form_type']);
switch ($form_type) {
----
case 'new_password':
if (!empty($user_data['id'])) {
$reset_password_new = $_POST['password'];
...
}
...
}
Pour ce faire, l'attaquant doit construire une requête POST avec un paramètre « token » invalide et le paramètre « user » contenant le nom d'utilisateur cible dans la chaîne de requête. Il doit également ajouter dans le corps de la requête « form_type » avec la valeur « new_password », « password » avec le nouveau mot de passe souhaité, et « csrf_token » avec un jeton valide (fourni par le formulaire de connexion, mais pas par le formulaire de réinitialisation de mot de passe).
Dans ce dépôt, vous trouverez un script Python pour exploiter la vulnérabilité et un conteneur Docker pour la tester.
git clone https://github.com/varandinawer/CVE-2020-28874_CVE-2020-28875.git
cd ./CVE-2020-28874_CVE-2020-28875/docker-r1270
docker-compose up
#To finish the process of ProjectSend installation, go to http://localhost in the browser and follow the indication to setup an admin account
cd ..
python CVE-2020-28874.py --url http://localhost --user admin --pwd newAdminP4ssword*
Mettez à niveau vers la version r1295 ou une version ultérieure.