Сайт не висит, но зарабатывает чужой трафик: скрытые ссылки после взлома

Раздел практики: техника.
- Свежие .php в uploads и шаблонах —
find -newermt - Якоря «казино/viagra» — grep по шаблонам темы
- Sitemap: URL, которых вы не создавали
- Отдача по YandexBot и обычному UA — curl с ключом -A
- Внезапные страницы в «Индексируется» ЯВ / GSC
Сделайте сегодня: сравните список URL из sitemap с фактическим списком страниц.
Владелец видит странность в выдаче: по названию сайта вместо статей — сниппеты со словами «казино», «зеркало». Сам сайт открывается чисто, ничего не висит, антивирус хостера молчит. Это «тихий» сценарий взлома: чужие ссылки тихо продают трафик, а репутация — ваша.
Основной разбор — в гайде про malware: доступы, чистка, перепроверка. Здесь обратная сторона: сайт не «лежит», а зарабатывает на вас — и как найти это командами.
Как выдают себя скрытые ссылки
Прямо в глаза они не смотрят — только косвенные, но проверяемые признаки:
- в «Страницах в индексе» ЯВ или в отчётах GSC — URL, которых вы не создавали;
- подстановка поиска по домену выдаёт «название сайта казино смотреть»;
- в логах — 200-ответы на несуществующие «статьи» с ботоподобным user-agent;
- в sitemap.xml — ссылки, которых нет ни в админке, ни в базе.
Быстрый срез по логу — какие URL отдают 200, но не похожи на ваши:
grep ' 200 ' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head
Где искать код: grep и find по конкретным папкам
Ищут в трёх местах: загрузка медиа, шаблоны темы, служебные плагины. Даты — лучший друг: свежие файлы на «стабильном» сайте почти всегда чужие.
find public_html -name '*.php' -newermt '2026-09-01'
grep -rn 'base64_decode\|eval(' public_html --include='*.php'
grep -Rni 'casino\|viagra\|leech' public_html/wp-content/themes
grep -Rn 'HTTP_USER_AGENT' public_html --include='*.php'
Смотрите uploads на php-файлы, включая двойные расширения вроде hero.jpg.php, mu-plugins, header/footer шаблонов. Якоря чужих ссылок живут в шаблоне, а не в тексте статей.
Сверка sitemap с индексом
Sitemap — удобная точка отсчёта: файл либо генерируется CMS и обязан совпадать с базой, либо создан не вами. Выгрузите адреса и сравните со списком реальных страниц:
curl -s https://example.com/sitemap.xml | grep -o '<loc>[^<]*' | sort -u > sm.txt comm -23 sm.txt my-urls.txt
my-urls.txt — выгрузка адресов из базы (SELECT guid FROM wp_posts WHERE post_status='publish') или экспорт из кабинета. Всё, что comm показал слева, — URL «которых нет», но они в карте. Каждый проверяется на отдачу: 200 — значит на диске есть файл или правило rewrite. Настройка самих файлов — в гайде про robots и sitemap.
Cloaking: человеку одно, боту другое
Классическая схема: обычному посетиту страница отдаётся чистой, поисковому боту — «магазином» со сотней ссылок. Условие висит на проверке $_SERVER['HTTP_USER_AGENT'] в PHP или на правилах в .htaccess. Сравните два ответа из консоли:
UA='Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)' curl -s -A "$UA" https://example.com/ | grep -c '<a ' curl -s -A 'Mozilla/5.0' https://example.com/ | grep -c '<a '
Если ссылок или байт в «ботовом» ответе заметно больше — cloaking на месте. То же с Googlebot. Параллельно грейте .htaccess на RewriteCond %{HTTP_USER_AGENT}.*(bot|spider): редиректы ботам на чужие «торговые» домены — тот же бизнес.
Типичный случай
Небольшой сайт услуг: владелец месяц ничего не менял, но в ЯВ — всплеск «новых страниц» с анкорами «сео-текстиль». Оказалось: в footer.php темы блок if (strpos($_SERVER['HTTP_USER_AGENT'],'bot')) дописывал 40 ссылок, а в uploads лежал include с текстами. Код снесли, пароли сменили — а ссылки жили в индексе ещё недели две: их снимали через «Удалить из индекса» и закрывали 410-м. Остаточные URL — в разборе 404 и редиректов, контроль кабинетов после чистки — по практике ЯВ/GSC.
Итог: скрытые ссылки ищутся не «антивирусом», а датами, grep и сверкой с sitemap. Если после чистки что-то осталось в выдаче — это кэш поисковика, а не живой код.