
CVE-2020-28874
Questo repository contiene la descrizione della vulnerabilità trovata (CVE-2020-28874) nella release r1270 di ProjectSend.
Ringrazio i miei colleghi di Entelgy Innotec Security per avermi spinto a migliorare!
La vulnerabilità è nel componente di reset della password; un attaccante può cambiare la password di qualsiasi utente noto tramite il suo nome utente, come admin, senza un token valido.
Questo è possibile perché il backend non pulisce $user_data con i dati utente caricati dal nome utente fornito.
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);
....
}
E usa lo stato di quella variabile per continuare il processo di reset della password.
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'];
...
}
...
}
Per farlo, l'attaccante deve creare una richiesta POST, con un parametro "token" non valido e il parametro "user" con il nome utente bersaglio nella query string; deve inoltre aggiungere "form_type" come "new_password", "password" con la nuova password desiderata, e il csrf_token con uno valido (dal modulo di login, il modulo di reset della password non lo fornisce) nel corpo della richiesta.
In questo repository puoi trovare uno script Python per sfruttare la vulnerabilità e un container Docker per testarla.
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*
Aggiorna alla versione r1295 o successiva.