Серьёзная уязвимость в osCommerce 2.2 RC 2a

Возможность выполнения произвольного PHP-кода с правами web-сервера

Сегодня один из моих клиентов пожаловался, что его online-магазин (на базе ) в очередной раз взломали и записали закодированный файл q_boot.php в каталог images. Хотя с osCommerce я сталкивался только один раз в жизни (подчищал вирус наподобие этого), меня этот случай очень заинтересовал: , которая позволяет злоумышленнику залить на сервер произвольный файл — это очень серьёзно.

Естественно, что от техподдержки клиента я не смог получить лог доступа к сайту (взломали неделю назад), чтобы посмотреть, с каких IP-адресов обращались к этому images/q_boot.php и проследить историю запросов. Это было бы слишком легко. Пришлось копаться в коде панели администрирования.

В частности, один из скриптов, который позволяет загружать файлы — это admin/banner_manager.php. Я начал с него, стал анализировать все включаемые файлы. Дыра нашлась за три минуты.

В admin/includes/application_top.php есть такой вот уязвимый код:

[-]
View Code PHP
  1. // redirect to login page if administrator is not yet logged in
  2.   if (!tep_session_is_registered('admin')) {
  3.     $redirect = false;
  4.  
  5.     $current_page = basename($PHP_SELF);
  6.  
  7.     if ($current_page != FILENAME_LOGIN) {
  8.       if (!tep_session_is_registered('redirect_origin')) {
  9.         tep_session_register('redirect_origin');
  10.  
  11.         $redirect_origin = array('page' => $current_page,
  12.                                  'get' => $HTTP_GET_VARS);
  13.       }
  14.  
  15.       $redirect = true;
  16.     }
  17.  
  18.     if ($redirect == true) {
  19.       tep_redirect(tep_href_link(FILENAME_LOGIN));
  20.     }
  21.  
  22.     unset($redirect);
  23.   }

Уязвимость не очевидна, если не знать разницу между $_SERVER['SCRIPT_NAME'], $_SERVER['SCRIPT_FILENAME'] и $_SERVER['PHP_SELF'].

В частности, PHP_SELF содержит

The filename of the currently executing script, relative to the document root. For instance, $_SERVER['PHP_SELF'] in a script at the address http://example.com/test.php/foo.bar would be /test.php/foo.bar.

Константа FILENAME_LOGIN определена как login.php.

Таким образом, обращение к /admin/banner_manager.php/login.php приведёт к тому, что в $_SERVER['PHP_SELF'] будет /admin/banner_manager.php/login.php, исполняться будет /admin/banner_manager.php, а basename($_SERVER['PHP_SELF']) будет — правильно, login.php. Условие в строке 138 не выполнится, и злоумышленник благополучно минует авторизацию.

Теперь эксплуатация уязвимости в картинках (изображения можно и нужно кликать):

Демонстрация уязвимости osCommerce: Proof of Concept

Первый скриншот демонстрирует возможность обхода авторизации и получения доступа к скриптам панели администрирования.

Демонстрация уязвимости osCommerce: изменение URL формы и загрузка PHP-файла

Второй скриншот демонстрирует изменение URL’а формы (при помощи FireBug) и загрузку PHP-файла.

Демонстрация уязвимости osCommerce: тестовый PHP-файл успешно загружен

На третьем скриншоте мы видим, что файл был успешно загружен (хотя мы и были перенаправлены на форму авторизации). А ведь все пользовательские данные нужно тщательно проверять!

Демонстрация уязвимости osCommerce: загруженный PHP-файл можно выполнить

На четвёртом скриншоте мы видим, что загруженный PHP-файл можно успешно выполнить :-) Что и требовалось показать :-)

Теперь о том, как это всё исправить.

А исправляется всё очень просто: исправляем

[-]
View Code PHP
$current_page = basename($PHP_SELF);

на

[-]
View Code PHP
$current_page = basename($_SERVER['SCRIPT_NAME']);

А еще лучше — отказываемся от osCommerce в пользу чего-нибудь нормального, так как эта уязвимость — не единственная.

К слову, текущая Alpha osCommerce 3 тоже уязвима, только по-другому… Делайте выводы.

Вложения:

Автор: ; опубликовано в: Безопасность; метки: osCommerce, взлом, уязвимость
18
Дек
2009

RSS Комментарии к статье «Серьёзная уязвимость в osCommerce 2.2 RC 2a» (14)  »

  1. Подобный баг нашли в ZenCart 1.3.8, который как раз является форком osCommerce. Проверил osCommerce 2.2 Milestone 2, в ней уязвимости нет. А вообще это просто ужас, что сейчас будет. Вам бы следовало сообщить разработчикам, прежде, чем выкладывать такие вещи. Благо некоторые админы закрывают доступ к папке admin через .htaccess и запрещают выполнение скриптов в images.

    • Разработчики знают. А уязвимость уже очень активно эксплуатируется (по моим прикидкам, как минимум с начала ноября), а исправлять никто не торопится, хотя делов на пять минут :-(

      В последней альфе osCommerce 3 уязвимость тоже существует, но через XML RPC.

  2. Уязвимость присутствует во всех версиях osCommerce, находящихся по ссылке на официальном сайте: http://www.oscommerce.com/about/news,129

    PS — а еще её спамеры эксплуатируют :-(

  3. dimanet

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

    • Отписал я разработчикам. Еще неделю назад. Дата публикации статьи и дата написания очень отличаются :-)

      Вообще на том сервере, где я закрывал дырку, эта уязвимость использовалась:

      • для рассылки спама пользователям;
      • для внедрения вредоносного кода;
      • для клоакинга;
      • для показа «левой» ркламы;
      • также предпринимались попытки посадить всякие шеллы и другие пакости (судя по всему, спасал только mod_security и «параноидальные» требования suphp).
      • dimanet

        хотя погуглив нашел эксплойт датированный [2009-08-31] . Что-то разработчики явно не спешат закрывать дыры

  4. Гугл выдал ссылка на хакер.ру Запись датируется 2006 годом, так что разрабы особо не шевелятся. :)

    • На xakep.ru несколько другая уязвимость — XSS (выполнение произвольного кода в браузере посетителя). А эта уязвимость позволяет творить разные нехорошие вещи уже на самом сервере.

      А разработчики на самом деле не шевелятся :-(

  5. Игорь Чапа

    Добрый день. Наш сайт был взломан, скорее всего по такой схеме и через такую дырку, что Вы описываете. Можете ли Вы взяться за работу по его чистке и сколько это будет стоить? Учитывая, что мааааленькая страна Молдова.

    Если можно напишите на указанный нами мейл

  6. AndyTakker

    Старая дыра. В версии 2.3 закрыта. Исправлять нужно определение PHP_SELF. Официальный фикс выглядит так – http://www.oscommerce.info/confluence/display/OSCOM23/%28AC%29+%28UP%29+Update+PHP_SELF+Value
    Данная публикация вызвала шквал атак на магазины.

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Серьёзная уязвимость в osCommerce 2.2 RC 2a»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा