Page promo image

Проверяем и "лечим" сайты от последствий критической уязвимости Drupal (SA-CORE-2014-005)

Как уже ранее сообщалось в Drupal 7 и Drupal 8 найдена критическая уязвимость типа типа SQL Injection. Всем пользователям настоятельно рекомендовано обновиться до последней стабильной версии Drupal 7.32 или до betta-2, если Вы используете 8-ю версию. Если по каким либо причинам Вы не можете обновить ядро системы целиком для защиты от уязвимости достаточно обновить только файл /includes/database/database.inc (если речь идет о 7-й ветке) или core/includes/database.inc (если Вы используете 8-ю ветку).

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

Чеклист для проверки сайта

  1. Проверяем не появились ли новые пользователи админы (состоящие в группе администратор, или других групп с повышенными правами), если есть, удаляем.
    Возможные имена "новых" пользователей:
    
    $users = array(
        'configure',
        'drplsys',
        'drupaldev',
        'n0n0x',
        'system',
      );
    
  2. Смотрим не появились ли новые группы (роли с повышенными правами), если появились, удаляем.
  3. Проверяем не поменяли ли email админа на сайте, меняем пароль (для главного админа и остальных админов, если они есть).
  4. Проверяем не засунули ли трояна в menu_router, это можно осуществить несколькими способами:
    1. Выполнив запрос к базе:
      
      SELECT * FROM menu_router WHERE access_arguments LIKE '%form1(@$_COOKIE%'
      
      
      Его результат в phpMyAdmin будет приблизительно таким:
      drupal menu router troyan example
      Пример: как выглядит вредоносный путь в базе сайта Drupal

      Путь (поле path) может быть при этом любым.

    2. Сделайте дамп базы данных и найти в нем все вхождения для подстроки '$form1=@$_COOKIE'.

    3. ставим модуль Site_audit.

  5. Найти и проанализировать все "*.php" файлы на сайте, созданные за последние 14 дней.

  6. Найти, проанализировать и исправить/перезаписать/удалить (в зависимости от того где встретилось) все файлы где встречается вхождение подстроки "base64_decode";
  7. Найти и исправить/перезаписать/удалить (в зависимости от того где встретилось) все файлы с вхождением подстроки "$form1=@$_COOKIE", команда для шелла ({site/sites_root} - замените на путь к корню сайта или директории с сайтами, если их несколько на сервере):
    
    find {site/sites_root} -type f -name "*.php" -exec grep -l '\$form1=@\$_COOKIE' {} \;
    
    find {site/sites_root} -type f -name "*.inc" -exec grep -l '\$form1=@\$_COOKIE' {} \;
    
    
  8. Найти и исправить/перезаписать/удалить (в зависимости от того где встретилось) все файлы с вхождением подстроки "<?php ${"\x47LOB\x41\x4c\x53"}";
    
    find {site/sites_root} -type f -name "*.php" -exec grep -l '<\?php \${"\\x47LOB\\x41\\x4c\\x53"}' {} \;
    
    find {site/sites_root} -type f -name "*.inc" -exec grep -l '<\?php \${"\\x47LOB\\x41\\x4c\\x53"}' {} \;
    
    
  9. Проверить файл .htaccess в корне сайта на наличие "левых" редиректов, подробности тут.

Если у Вас на обслуживании/использовании находится сразу несколько сайтов, расположенных на одном сервере, под управлением CMS Drupal, версии которых подвержены уязвимости, то с первыми 4-я пунктами Вам поможет справиться такой скрипт:


$sever = 'servser_name';
$user = 'root_user_name';
$password = 'root_user_password';

$link = mysql_connect($sever, $user, $password);
$res = mysql_query("SHOW DATABASES");

$fake_user_names = array(
    '\'configure\'',
    '\'drplsys\'',
    '\'drupaldev\'',
    '\'n0n0x\'',
    '\'system\'',
);

$fake_user_names_imploded = implode(', ', $fake_user_names);

$uses_check_command = "SELECT * FROM `users` WHERE `name` IN (" . $fake_user_names_imploded . ")";
$routings_check_command = "SELECT * FROM menu_router WHERE access_arguments LIKE '%form1(@\$_COOKIE%'";
$roles_check_command = "SELECT * FROM  `role` WHERE `name` = 'megauser'";

$count = 0;

while ($row = mysql_fetch_assoc($res)) {
  mysql_select_db($row['Database'], $link);

  if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'users'")) == 1 &&
      mysql_num_rows(mysql_query("SHOW TABLES LIKE 'node'")) == 1) {

        $msg = '';

        if (mysql_num_rows(mysql_query($uses_check_command))) {
           $msg .= " Fake user exists.";
        }
        else {
          if (mysql_num_rows(mysql_query($roles_check_command))) {
            $msg .= " Fake user role exists.";
          }
        }

        if (mysql_num_rows(mysql_query($routings_check_command))) {
          $msg .= " Troyan route exists.";
        }

        if ($msg) {
          echo '' . $row['Database'] . ':' . $msg . '

';
          $count++;
        }
  }
}

echo 'Total ' . $count . ' problems.';

 

 

comments powered by Disqus