Перейти до основного вмісту
Спам в sitemap.xml через злом сайту на Drupal 7

При аудиті чергового сайту клієнта, у якого почала падати відвідуваність сайту, було виявлено що в карті сайту, замість посилань на справжні сторінки сайту показує тисячі спамних посилань, замаскованих під посилання сайту, але при переході на них юзера перекидає на сайт по продажі усякої віагри, сіалісу та інших дженеріків.

Звісно, наявність такого непотрібу в карті сайту не міг позитивно сказатися на позиціях сайту в пошукових системах, хоча в Search Console ніяких санкцій та попереджень видно не було.

Де було сховано?

В першу чергу я перевірив сайт усілякими антивірусами але вони нічого не знайшли. По логіці, якщо підміняється sitemap.xml, я вимкнув та видалив цей модуль з сайту - не допомогло. Перевірка .htaccess, php файлів теми та ядра теж нічого не дали. Врешті у файловій системі в папці sites/default/files почав передивлятися файли зображень та натрапив на один дивній файл: a.jpg, відкривши який за допомогою notepad++ побачив наступний код:

a.jpg

a.jpg 2

Ясно що це воно.

Як лікувати?

Просто видаливши цей файл ми отримаємо помилку, яка кладе весь сайт

Failed to open stream: No such file or directory in drupal_bootstrap() (line 2588 of \includes\bootstrap.inc).

В bootstrap.inc в рядку 2588 ми бачимо:

case DRUPAL_BOOTSTRAP_SESSION:
          require_once DRUPAL_ROOT . '/' . variable_get('session_inc', 'includes/session.inc');
          drupal_session_initialize();
          break;

Ми бачимо що стрічка використовує функцію variable_get для отримання шляху до включеного файлу. Ця функція перевірить, чи встановлено змінну (в даному випадку session_inc). Якщо змінну не встановлено, вона поверне значення за замовчуванням, надане як другий аргумент (в даному випадку includes/session.inc).

Перевіривши всі основні файли на предмет стороннього коду я переконався що вони чисті, але де ж зберігається змінна session_inc? Залишається тільки БД

Йдемо в phpmyadmin до нашої бази та шукаєму по таблицям всі записи з session_inc

пошук session_inc

В моєму випадку знайшло три збіга: в таблицях cache_bootstrap, variable, та registry_file

Після того як видалили сам файл a.jpg видаляємо знайдені строки с таблиць variable та cache_bootstrap. Все, сайт вилікувано, але як не допустити такого в майбутньому?

Профілактика

Друпал 7 вже застаріла версія яка зовсім скоро зовсім перестане відновлюватися, то ж в ідеалі треба робити переїзд на 9 або 10 версію. Але якщо переїзд не можливий то зробіть хоча б:

  1. Перезалити всі файли ядра на файли самої останньої версії сьомого Друпала
  2. Оновити всі модулі які того потребують
  3. Перевірити права користувачів
  4. Перевірити права на папки та файли
  5. Перевірити що файл tmp не доступний для публічного доступу та знаходиться за межами корньової директорії
  6. Встановити модуль MimeDetect який запобігає завантаженню фото с стороннім кодом
  7. Змінити паролі до хостингу, FTP

Я не хакер, не знаю які ще вразливості можуть бути використані, тому буду вдячний за додаткові пункти по закриванню можливих дірок. До речі, такий метод хакінгу має практику зустрічатися не тільки з сайтами на CMS Drupal, а й на всіх інших популярних CMS, просто я здебільш працюю саме с Друпал.

Як бачите, в практиці SEO оптимізатора зустрічаються різноманітні ситуації та причини, чому сайт не росте в пошуку, тож повинний бути немалий багаж різноманітних, сміжних з SEO знать, щоб ефективно знаходити та виправляти знайдені помилки на сайті. Якщо Вам необхідний технічний SEO аудит сайту, звертайтеся, вся інфа на сторінці послуг за посиланням.

ПІдписка

Про автора

Автор цього блогу. У SEO понад 10 років. Окрім SEO цікавлюся всім, що пов'язано з технологіями та заробітком в інтернеті про що й стараюся ділитися з читачами.