Перейти к содержимому
Alex Kovalev

Проверка безопасности WordPress

Внешняя половина моего чек-листа по безопасности WordPress. Введите адрес сайта и посмотрите, что любой бот видит уже сейчас.

Этот инструмент не может работать только в браузере: адрес уходит небольшому сканеру на этом сайте, и тот заходит на него как обычный браузер. Только чтение; для защиты от злоупотреблений он записывает одну строку на проверку (время, IP-адрес, сайт, оценка). Названия плагинов и номера версий (но не ваш адрес) сверяются с публичной базой уязвимостей.

–Оценка

Ещё не проверено

Введите адрес и нажмите «Проверить». Строки ниже заполнятся, когда придут ответы.

Проверки

  • Это WordPress?

    Следы на главной странице.

    не проверено
  • HTTPS и сертификат

    Шифруется ли сайт и в порядке ли сертификат.

    не проверено
  • Логины в REST API

    Может ли кто угодно получить список пользователей по /wp-json/wp/v2/users.

    не проверено
  • Логины через ?author=

    Ведёт ли /?author=1 к имени пользователя.

    не проверено
  • XML-RPC

    Отвечает ли ещё xmlrpc.php.

    не проверено
  • Забытые файлы

    Бэкапы конфига, .env, дампы базы, .git, debug.log.

    не проверено
  • Список файлов в загрузках

    Можно ли листать папку загрузок как список файлов.

    не проверено
  • Известные дыры в этом WordPress

    Видимая версия, сверенная с базой уязвимостей.

    не проверено
  • Плагины с известными дырами

    Плагины, которые грузит главная, и их версии, сверенные так же.

    не проверено
  • Темы с известными дырами

    Активная тема (и её родительская), сверенные так же.

    не проверено
  • Видна ли версия

    Сообщает ли страница, какой у неё WordPress.

    не проверено
  • Заголовки безопасности

    HSTS, CSP, защита от кликджекинга и компания.

    не проверено
  • Баннеры сервера

    Сообщает ли сервер свой софт и версию.

    не проверено
  • Версия PHP

    Получает ли объявленный PHP исправления безопасности.

    не проверено
  • WP-Cron

    Может ли кто угодно запустить wp-cron.php.

    не проверено

Чего сканер не видит

Отмечайте по ходу дела. Галочки живут только в этой вкладке.

Прочитать весь чек-листТолько чтение того, что сайт показывает любому посетителю. Первый проход, а не доказательство безопасности.

Как пользоваться

5 шагов
  1. Введите адрес сайта. Достаточно example.com; путь после домена игнорируется, потому что проверяются только главная страница и несколько стандартных адресов WordPress.
  2. Поставьте галочку: сайт должен быть вашим, или у вас должно быть письменное разрешение его проверять.
  3. Нажмите Проверить. Это займёт несколько секунд, сканер отправит не больше 32 запросов, все обычные GET или HEAD.
  4. Сначала исправьте красные строки. В каждой написано, что нашлось и что поменять, и есть ссылка на часть чек-листа, где объясняется зачем.
  5. Потом пройдитесь по списку Чего сканер не видит: бэкапы, пароли, обновления. В нём и есть основная работа.

Что он делает

2 мин чтения

Большинство взломов WordPress — это не хитрость. Бот берёт список известных слабых мест и пробует его на тысячах сайтов. Этот инструмент задаёт те же вопросы, что и бот, и вы видите сайт так же, как он: видны ли ваши логины по адресу /wp-json/wp/v2/users, отвечает ли xmlrpc.php, сообщает ли страница версию WordPress и есть ли эта версия (или плагины и тема, которые грузит страница) в списках известных уязвимостей, не лежат ли в корне сайта бэкапы или .env, можно ли листать папку загрузок, работает ли сайт по HTTPS с правильным сертификатом, есть ли базовые заголовки безопасности.

Он пассивный намеренно. Он читает только то, что сайт показывает любому посетителю: никаких входов в админку, подбора паролей, эксплойтов, POST на XML-RPC, никакого скачивания wp-config.php или бэкапов: про забытые файлы он спрашивает запросом HEAD, который возвращает только заголовки. Сайт, который прошёл проверку, не «защищён». У него просто нет очевидно открытых на улицу дверей.

Почему здесь нужен сервер, хотя остальным инструментам он не нужен: браузеру нельзя читать заголовки ответов чужого сайта, а заголовки — половина проверок. Поэтому адрес уходит небольшому сканеру на этом сайте. Он отказывается ходить на частные и внутренние адреса, заново проверяет каждый редирект, прежде чем по нему пойти, останавливает проверку после 32 запросов или 30 секунд и разрешает каждому посетителю всего несколько проверок в минуту, одному сайту — несколько проверок за десять минут, а всем вместе — небольшое число в день. Повторный запрос про тот же сайт в течение пяти минут показывает тот же отчёт, а не сканирует снова. Каждая проверка оставляет одну строку в журнале (время, ваш IP-адрес, сайт и оценка), чтобы можно было заметить злоупотребления; она лежит вместе с остальными журналами сервера, которые со временем удаляются. Для строк про уязвимости он читает публичный readme.txt каждого плагина, чтобы узнать установленную версию, и спрашивает бесплатную базу WPVulnerability про этот плагин и версию; ваш адрес в этот вопрос не входит.

Оценка начинается со 100 и теряет баллы за находки: 25 за публичные логины или доступный для скачивания бэкап, .env или копию конфига, до 20 за каждый уязвимый плагин и 15 за уязвимое ядро, по 10 за XML-RPC, открытую для просмотра папку загрузок, видимую версию, отсутствие HTTPS или плохой сертификат и немного за недостающие заголовки и болтливые баннеры сервера. От 85 — хорошая база, от 65 до 84 — стоит заняться, ниже — сначала закройте открытые двери. Объяснение каждой строки и всего, чего сканер не видит, — в чек-листе по безопасности WordPress.

Вопросы

5 вопросов

Почему он пишет, что WordPress не найден?

Он ищет следы WordPress на главной странице: ссылки в wp-content или wp-includes, тег generator, заголовок Link с wp-json. Агрессивный кеш или плагин «спрятать WordPress» могут убрать их все, а WordPress в папке вроде /blog/ на главной не виден вообще. Тогда остальное не проверяется, и оценка остаётся пустой, а не притворяется.

Как спрятать логины?

Не блокируйте весь /wp-json/: он нужен блочному редактору и многим плагинам. Закройте только маршрут пользователей для тех, кто не вошёл. В большинстве плагинов безопасности для этого есть переключатель, а в чек-листе есть короткий сниппет, если плагин ставить не хочется. Потом проверьте снова: строка должна стать зелёной с ответом 401, 403 или 404.

Что значит «неясно»?

Сайт ответил чем-то, что проверка не может прочитать: страницей-проверкой файрвола, ошибкой, таймаутом. Это не считается ни за, ни против. Файрволы вроде Cloudflare или Imunify360 часто отвечают сканерам не так, как браузерам, поэтому проверьте эту строку из своего терминала, например curl -I https://example.com/xmlrpc.php.

Он показывает уязвимость, которую я уже закрыл.

Версия берётся из того, что показывает сайт: тег generator или ссылки на файлы ядра для WordPress, readme.txt или ссылки на ресурсы для плагинов. Readme, оставшийся от старой версии, или плагин кеша со старыми ссылками могут отставать от того, что установлено. Настоящие версии — в «Консоль → Обновления». Плагины, которые ничего не грузят на главной, отсюда не видны, так что их тоже проверьте там.

Можно проверить чужой сайт?

Только с письменного разрешения владельца. Проверки читают те же публичные страницы, что и поисковик, но проверять сайт, за который вы не отвечаете, — всё равно что дёргать двери у незнакомых людей. Галочка стоит именно поэтому.

Ещё инструменты на стене