PT-2012-30: Получение привилегий администратора в OpenCart

Уязвимое ПО

OpenCart
Версия: 1.5.3.1 и более ранняя

Ссылка:
http://www.opencart.com/

Рейтинг опасности

Уровень опасности: Высокий
Воздействие: Получение привилегий администратора
Вектор атаки: Удаленный

CVSS v2:
Base Score: 9.3
Vector: (AV:N/AC:M/Au:N/C:C/I:C/A:C)

CVE: отсутствует

Описание программы

OpenCart - это программное обеспечение с открытым исходным кодом и дружественным пользователю интерфейсом и множеством функций, которое используется для создания виртуальных магазинов.

Описание уязвимости

Специалисты Исследовательского центра Positive Research компании Positive Technologies обнаружили уязвимость "Получение привилегий администратора" в OpenCart.
Из-за того, что в механизме восстановления пароля используется небезопасный способ генерирования случайных чисел, атакующий может получить пароль администратора или других пользователей форума:

1. Предсказуемость кода подтверждения на сброс пароля администратора

Уязвимый фрагмент кода: admin/controller/common/forgotten.php

$code = md5(mt_rand());

Для сброса пароля администратора требуется указать его электронный адрес. Если атакующему известен электронный адрес администратора, который зачастую имеет вид admin@host.com, то он может изменить пароль администратора.
Эксплуатация данной уязвимости возможна, т. к. OpenCart получает случайные числа с помощью PHP-функции mt_rand, реализующей алгоритм Mersenne Twister, при этом генератор случайных чисел не инициализируется с помощью функции mt_srand.
В этом случае PHP для инициализации генератора используется псевдо-случайное 32-битное целое число, полученное на основе данных окружения текущего процесса.
Получив вывод функции mt_rand, атакующий имеет возможность получить исходное значение, использованное для инициализации генератора, путем перебора всех значений (2^32).
В OpenCart возможно получение значения функции mt_rand в виде MD5-хэша:

POST /admin/index.php?route=user/user HTTP/1.0
Host: host
Content-Length: 0
Connection: keep-alive

 

HTTP/1.1 302
...
Location: http://host/admin/index.php?route=common/home&token=2ead018af57862dda59cb67b77f19075

Таким образом, расшифровав md5 и получив случайное число, атакующий может получить исходное значение, использованное для генерирования случайных чисел, а затем предугадать все последующие случайные числа.
Для реализации атаки необходимо отправить два keep-alive запроса. Сначала атакующий получает MD5-хэш от случайного числа, а затем запрашивает страницу сброса пароля администратора. С помощью действий, описанных выше, атакующий имеет возможность получить код для подтверждения смены пароля и изменить пароль администратора.

2. Предсказуемость сгенерированного пароля при сбросе пароля обычного зарегистрированного пользователя или партнера (affiliate)

Уязвимый фрагмент кода: catalog/controller/account/forgotten.php, catalog/controller/affiliate/forgotten.php

$password = substr(md5(mt_rand()), 0, 10);

Для сброса пароля пользователя требуется указать его электронный адрес. Если электронный адрес известен, то существует возможность смены пароля без какого-либо дополнительного подтверждения, новый пароль будет отправлен на электронный адрес пользователя.
Аналогично работе с учетной записью администратора, атакующий имеет возможность предугадать сгенерированный пароль пользователя.

Решение

Установите последнюю версию приложения

Статус уведомления

23.08.2012 - Производитель уведомлен
23.08.2012 - Производителю отправлены детали уязвимости
23.08.2012 - Производитель выпустил исправление
11.09.2012 - Публикация уязвимости

Благодарности

Уязвимость обнаружил Арсений Реутов (Исследовательcкий центр Positive Research компании Positive Technologies)

Ссылки

http://www.securitylab.ru/lab/PT-2012-30

Список отчетов о ранее обнаруженных уязвимостях Positive Research:

http://www.ptsecurity.ru/lab/advisory/
http://www.securitylab.ru/lab/

Уязвимости