Уязвимость osCommerce 2.2 RC 2a
В последнее время мои клиенты, которые пользуются osCommerce 2.2 RC 2a стали обращаться ко мне с жалобами на странное поведение их магазинов. При осмотре поциента я стал замечать вставки кода, которого быть по определению не должно, и наличие левых файлов. Первой мыслью была халатность заказчиков, которые могли оставить пароль к ftp аккаунту в открытом виде в конфиге total commander'a. Известны случаи, когда трояны собирали подобные файлы и отправляли их по нужному адресу.
По своей наивности я не мог допустить, что в osCommerce может быть дыра, да еще такая огромная, ведь добрая половина предпренимателей пользуется именно коммерсом. Но после моих рекомендаций изменить пароль и не хранить его в открытом виде ситуация снова повторилась. И я начал искать откуда ноги растут.
После продолжительных поисков выяснилось, что мудак злоумышленник может спокойно загружать файлы на сервер через web интерфейс. Причем доступ к нему любезно согластлись дать сами разработчики osCommerce.
Давайте посмотрим программный код и попытаемся разобраться в чем же дело:
файл application_top.php
if (!tep_session_is_registered('admin'))
{
$redirect = false;
$current_page = basename($PHP_SELF);
if ($current_page != FILENAME_LOGIN)
{
if (!tep_session_is_registered('redirect_origin'))
{
tep_session_register('redirect_origin');
$redirect_origin = array('page' => $current_page, 'get' => $HTTP_GET_VARS);
}
$redirect = true;
}
if ($redirect == true)
{
tep_redirect(tep_href_link(FILENAME_LOGIN));
}
unset($redirect);
}
Это проверка сеанса пользователя. Вроде бы все в порядке. Но! Откуда береться переменная $PHP_SELF? А она объявляется выше:
$PHP_SELF = (isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']);
Уязвимость становиться очевидной, если знать разницу между $HTTP_SERVER_VARS['PHP_SELF'] и $HTTP_SERVER_VARS['SCRIPT_NAME'].
При запросе /admin/categories.php/login.php переменная $HTTP_SERVER_VARS['PHP_SELF'] содержит строку /admin/categories.php/login.php
Результат после выполнения функции $current_page = basename($PHP_SELF); будет содержать login.php и следовательно условие if ($current_page != FILENAME_LOGIN) не выполнится, что и нужно мудаку злоумышленнику, чтобы проникнуть в святую святых )))
Указываем путь к файлу, который необходимо загрузить на сервер. Меняем адрес формы в firebug и отправляем форму.
Вот и все - файл загружен.
Он занял почетное место среди других файлов. Кстати, чтобы не вызвать подозрений, хакеры называют файлы типа google-analitycs.php и в этом духе.
Вызываем файл на исполнение. Как правило, файл выполняет более интересные задачи, нежели в моем примере.
Так же, между делом можно взглянуть на каталог, покупателей или заказы.
Кстати, osCommerce Online Merchant v2.3.1 не содержит в себе такой уязвамости. Поэтому, мы используем его код для устранения дыры в osCommerce 2.2 RC 2a.
Открываем файл application_top.php, находим строчку
$PHP_SELF = (isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']);
и заменяем ее на
$PHP_SELF = (((strlen(ini_get('cgi.fix_pathinfo')) > 0) && ((bool)ini_get('cgi.fix_pathinfo') == false)) || !isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) ? basename($HTTP_SERVER_VARS['PHP_SELF']) : basename($HTTP_SERVER_VARS['SCRIPT_NAME']);
Переменная $HTTP_SERVER_VARS['SCRIPT_NAME'] содержит в себе только имя исполняемого скрипта и поэтому условие if ($current_page != FILENAME_LOGIN) сработаем, и хакера попросят авторизироватся.
Так же настоятельно рекомендую удалить файловый менеждер, если, конечно, вы его не используете часто. Так будет спокойней.
Интересное




Комментарии
Чтобы оставлять комментарии, авторизируйтесь