CMS WordPress является достаточно популярной платформой для ведения блогов и создания сайтов. Это же автоматически подразумевает большое количество желающих использовать Ваш сайт для своих целей:
- перехват и перепродажа трафика
- размещение ссылок
- создание бота на Вашем сервере/сайте
- отправка спама

После серьезной атаки только наличие актуальной копии позволит восстановить рабочий сайт. При заражении сайта практически невозможно его отремонтировать на 100%. В движке порядка 4000 файлов, все их вычистить от вирусов очень сложно. Где-то что-то останется, какие-то функции после очистки сломаются. А наличие бэкапа позволит восстановить сайт на 100%. Это вообще полезное мероприятие - периодически делать полные бэкапы.
Для создания backup можно использовать или ресурсы хостинга или установить плагин BackWPup, который как понятно из названия, копирует весь Ваш сайт (все файлы и базу MySql) в облако (например DropBox).

Посмотрим статистику.
Для начала устанавливаем плагин Activity Log (логгирование действий пользователей), активируем
И видим следующие картину



Кто все эти люди и откуда они знают мой логин?

Это не люди мучают клавиатуру с ручным подбором паролей, это боты (зараженные компьютеры). Точнее даже не компьютеры, а устройства типа микроволновки и холодильника. Сейчас везде производители ставят процессоры и выход в интернет, на таких устройствах практически нет никакой защиты, их взламывают и они вливаются в ряды ботов.
Еще есть «банды умных лампочек» – smart-лампы с управлением со смартафона через Wi-Fi. Тоже хорошо взламываются и начинают работать на чужих дядей.

Основных векторов атаки несколько. Общая структура папки Вашего сайта на WordPress (на сервере хостинга) следующая




Сайт сайт запускается файлом index.php в корневой папке.

Существует два варианта входа в систему управления сайтом:

- через браузер в административную панель
вход или site.ru/wp-admin (тут расположена сама панель управления) или site.ru/wp-login.php (проверка логина/пароля)

- через мобильное приложение (Android / iOS), см. ниже - указываем логин/пароль и сайт (уже без "хвостика" /wp-admin)



после проверки логина/пароля в файле wp-login.php происходит переход к файлу xmlrpc.php, вид самой мобильной панели управления зависит от используемого приложения.

Итого нам надо перекрыть (добавить проверку на уровне сервера) три пути входа:
- файл проверки логина/пароля site.ru/wp-login.php
- административную панель (папка) через браузер site.ru/wp-admin
- файл для работы с мобильным приложением site.ru/xmlrpc.php

1. Взлом административной панели WordPress

WordPress достаточно легко выдает логин всем желающим по запросу http://site.ru/?author=1, где site.ru – домен Вашего сайта
Цифра 1 на конце запроса – это ID пользователя, перебирая все цифры, мы получаем список всех логинов пользователей.

Более того, при авторизации с правильным логином и неправильным паролем – WordPress радостно подтверждает правильность логина, скан ниже.




Что можно сделать?

Вариант - заменить стандартное имя файла wp-login.php на свой вариант вида myadmin.php, но это связано с многими изменениями вызова данного файла в коде движка. И очередное обновление все это отменит.

А) Устанавливаем дополнительную проверку на всех уровнях
- файл проверки логина/пароля wp-login.php
- папка административной панели /wp-admin
- файл для работы через мобильное приложение xmlrpc.php

Для закрытия папки /wp-admin нам необходимо два файла:
- файл .htaccess внутри самой папки
- файл .thpasswd на уровне выше папки с сайтом (вне доступа браузера)

Подробнее читаем здесь Защита папки на сервере

Сами файлы авторизации закрываем аналогично в файле .htaccess, который находится в корневой директории (т.е. там же, где  эти файлы)

<Files wp-login.php>
AuthType Basic
AuthName "It's not for all"
AuthUserFile
/home/сервер/ваш_сайт.ru/.htpasswd
require valid-user
</Files>

<Files xmlrpc.php>
AuthType Basic
AuthName "It's not for all"
AuthUserFile
/home/сервер/ваш_сайт.ru/.htpasswd
require valid-user
</Files
>

ВАЖНО (для файла .htaccess в корневой директории):

1. Для WordPress все свои инструкции необходимо указывать вне пределов модуля 
# BEGIN WordPress
# END WordPress
Внутри этой конструкции сам движок WordPress пишет свои инструкции

2. Если Вы по ошибке укажете дополнительные инструкции внутри этого модуля - то WordPress их затрет
В результате хакеры получат доступ к Вашему актуальному логину через  http://site.ru/?author=1 и придется менять основной логин еще раз.

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

Б) Оставляем в покое файл проверки логина/пароля wp-login.php и закрываем:
- папку административной панели /wp-admin
- файл для работы с мобильным приложением xmlrpc.php

Враг по прежнему не пройдет, но мы будем видеть в статистике атаки на подбор пароля.

В этом случае необходимо дополнительно:
- ограничить количество попыток неверного ввода пароля
- закрыть информацию о правильном вводе логина в форме авторизации
- закрыть возможность получения правильного логина
- удалить стандартный логин admin (с ID=1) и завести новый логин администратора
- сменить отображение этого пользователя на сайте (что бы отображение не совпадало с логином)

Плагин Limit Login Attempts Reloaded

Настройки очень простые:



Делает несколько полезных вещей:
- ограничивает число попыток ввода пароля (настраивается)
- прячет информацию о правильном логине, теперь страница входа (после ошибки) выглядит так



Также ведется лог попыток (изоляций), видно, что роботы с мобильных устройств (да, да - через вход xmlrpc.php) более тупые. Бьются до исчерпания всех 4-х попыток, установленных в качестве ограничения.



Более умные роботы (ботнеты) видят защиту и пробуют вход с одного IP не более 2-х раз, что бы администратору не отсылалась информация о переборе паролей.

После установки логина/пароля на файл xmlrpc.php для нормального пользователя все логично - сначала мобильное приложение запрашивает логин/пароль от WordPress, потом идет запрос пароля от сервера HTTP. Боты пытаются сразу обратиться к файлу xmlrpc.php и получают пинок в виде запроса пароля от сервера HTTP. Соответственно все многократные попытки подбора по XMLRPC из логов исчезают. 

Если все сломалось. Как разблокировать плагин limit login attempts? Заходите на хостинг по ftp, далее в www/wp-content/plugins, находите там папку с этим плагином и удаляете.

Закрываем возможность выдачи логинов всем желающим - внесем изменения в файл .htaccess в корне сайта. Добавим в модуль переадресации

#lock info author
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://site.ru/? [L,R=301]
Redirect 301 /author http://site.ru

(если нужно убрать только возможность запроса автора с ? и оставить вывод публикаций автора, если автор известен - то последняя строка не нужна)

Вместо site.ru указывайте Ваш домен.

Сменить стандартный логин администратора, не просто переименовать, а сделать новый логин с новым ID и изменить его отображение. Т.е. отображение пользователя на сайте (как например, автора статей) не должно совпадать с его логином для входа в систему. Изменяется в настройках пользователя.



Старый (скомпроментированный) логин можно удалить или временно заблокировать с помощью плагина Lock User Account (в списке Действий помимо Удалить еще появится выбор Lock и UnLock).


2. Взлом файла конфигурации wp-config.php, получение доступа к базе MySql и перехват управлением сайта

В данном файле хранится логин/пароль (в открытом виде) для базы MySql и другая полезная служебная информация. Для CMS WordPress есть простой способ спрятать этот файл. Его можно перенести из папки www (на сервере хостинга) на уровень выше. Сам движок WP его там найдет (сайт продолжит работу как и раньше), но из браузера на этот уровень зайти невозможно - HTTP server отдает браузеру только данные из папки www

3. Взлом с использованием выявленных уязвимостей WordPress - скрываем информацию о текущей версии.

В свежеустановленной системе информация о версии показывается:
- в коде любой страницы
ищем <meta name="generator" content="WordPress 4.4.2" />

- в коде ленты RSS по адресу http://site.ru/feed/
ищем <generator>https://wordpress.org/?v=4.6.4</generator>

- в файле site.ru/readme.html
Важно: если Вы уже установили защиту папки /wp-admin, то файл просто так у злоумышленника не откроется, будет запрошен логин/пароль сервера, т.к. в этом файле есть отсылки к данным внутри административной панели.

- в коде страницы входа

site.ru/wp-login.php

- в файле русификации движка по адресу
site.ru/wp-content/languages/ru_RU.po

Смотрим исходный код страницы, ищем "ver" в подключениях таблиц стилей

1 <link rel='stylesheet' id='buttons-css'  href='https://www.site.com/wp-includes/css/buttons.min.css?ver=4.4.2' type='text/css' media='all' />
2 <link rel='stylesheet' id='dashicons-css'  href='https://www.site.com/wp-includes/css/dashicons.min.css?ver=4.4.2' type='text/css' media='all' />
3 <link rel='stylesheet' id='login-css'  href='https://www.site.com/wp-admin/css/login.min.css?ver=4.4.2' type='text/css' media='all' />

Все это надо спрятать от злоумышленников.

4. Прямая атака на базу MySql

Собственно, в базе MySql хранятся все "детали" от Вашего сайта.
По умолчанию, при установке WordPress создает в базе таблицы с префиксом wp_. Злоумышленники об этом знают. Необходимо либо при установке выбрать другой префикс вида mysite_ (WordPress спросит при установке, не более 6-ти латинских букв), либо поменять его у готового сайта.

Это возможно сделать с помощью плагина Change DB Prefix

ВАЖНО: перед сменой префикса в базе MySql на уже работающем сайте обязательно сделайте себе копию (файлы движка, картинки, база) на локальный ПК. Это позволит восстановить сайт при возможном сбое.

Устанавливаем плагин, активируем.



До запуска плагина необходимо дать разрешение на запись в файл wp-config.php, указать на хостинге CHMOD 755 или 777.

Потом вводим свой вариант для префикса (поле New Prefix) и запускаем плагин. После сделанных изменений убираем разрешение на запись для файла wp-config.php и удаляем этот плагин, т.к. он свою задачу уже выполнил.

Список плагинов для безопасности WordPress можно посмотреть 

http://ahawks.ru/wordpress/plagin/plagin-dlya-zashhity-wordpress-sajta-2.html
  • CMS WordPress (1005)

    WordPress - система управления сайтом. Официальный сайт wordpress.org Изначально была ориентирована больше на ведение блогов, но и обычный сайт на этой системе можно сделать неплохой. Первый релиз был выпущен в мае 2003 года. Система написана на PHP, поддерживает базы MySQL. Возможно создание нескольких сайтов под управлением...

  • Защита WordPress (341)

    CMS WordPress является достаточно популярной платформой для ведения блогов и создания сайтов. Это же автоматически подразумевает большое количество желающих использовать Ваш сайт для своих целей:- перехват и перепродажа трафика- размещение ссылок- создание бота на Вашем сервере/сайте- отправка...

  • Плагин для SEO (144)

    Что бы заниматься продвижением сайта (SEO), нужно как минимум получать информацию по посетителям и отслеживать сайт в Вебмастере поисковых систем.1. Установка счетчиков на сайт и прав на сайт в ВебмастереВсе делает один плагин WordPress DL Verification.Конечно, необходимо предварительно зарегистрироваться и в...

  • "Мусорные" страницы (141)

  • WordPress: плагин или изменение кода (137)

    На многих ресурсах предлагаю внести изменения в код в файле function.php, тем более, что WordPress позволяет сделать это через встроенный редактор.Здесь добавили, тут поменяли - все отлично работает.Насколько это хорошо? Решив быстро текущую проблему, Вы обеспечиваете себе много проблем на...

  • WordPress & FaceBook (129)

    Интеграция с facebook - зачем это нужно?Это еще один катал продвижения Вашего сайта. Суть - Вы делаете в facebook страницу, ей посетители ставят"лайк", Вы выкладываете в ленту свои события, посетители их видят в своей ленте. Точнее, Вы события выкладываете на сайте, они с помощью плагина...