
CVE-2020-28874
Этот репозиторий содержит описание найденной уязвимости (CVE-2020-28874) в ProjectSend релиз r1270.
Спасибо моим коллегам из Entelgy Innotec Security за то, что подтолкнули меня к улучшению!
Уязвимость находится в компоненте сброса пароля: злоумышленник может изменить пароль любого известного пользователя по его имени пользователя, например admin, без действительного токена.
Это возможно, потому что бэкенд не очищает $user_data данными пользователя, загруженными из предоставленного имени пользователя.
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);
....
}
И использует состояние этой переменной для продолжения процесса сброса пароля.
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'];
...
}
...
}
Для этого злоумышленнику нужно сформировать POST-запрос с недействительным параметром "token" и параметром "user" с именем целевого пользователя в строке запроса, а также добавить в тело запроса "form_type" как "new_password", "password" с желаемым новым паролем и csrf_token с действительным значением (из формы входа; форма сброса пароля его не предоставляет).
В этом репозитории вы можете найти python-скрипт для эксплуатации уязвимости и docker-контейнер для её тестирования.
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*
Обновитесь до версии r1295 или выше.