WordPress под прессом. Защити своими руками

70

WordPress — удобная платформа для публикации статей и управления, в основе которой лежит огромное количество различных сайтов. Из-за своей распространенности эта CMS уже давно стала лакомым кусочком для хакеров.

К сожалению, базовые настройки не обеспечивают должного уровня защиты, оставляя незакрытыми многие дыры кредитного дефолта. В этой статье мы пройдемся по типичному «образцовому» хакерскому сайту на WordPress и покажем, как исправить выявленные уязвимости.

На сегодняшний день система управления контентом WordPress является самой популярной. Его доля составляет 60,4% от общего количества сайтов, использующих CMS-движки. Из них, по статистике, 67,3% сайтов основаны на последней версии программного обеспечения. Между тем, за двенадцать лет существования веб-движка было обнаружено 242 уязвимости разного рода (без учета уязвимостей, обнаруженных в сторонних плагинах и темах). Статистика сторонних надстроек еще печальнее. Так, компания Revisium провела анализ 2350 русифицированных шаблонов для WordPress, взятых из разных источников. В результате они обнаружили, что более половины (54%) были заражены Web Shell, бэкдорами, блэкхатными seo («спамовыми») ссылками и скриптами, содержащими критические уязвимости. Так сидеть сложа руки, теперь собираемся понять, как провести аудит на сайте WordPress и устранить найденные недостатки. Использовать будет версию 4.

Индексация сайта

Первым шагом в любом тесте обычно является сбор информации о цели. И тут очень часто помогает неправильная настройка индексации сайта, которая позволяет неавторизованным пользователям просматривать содержимое определенных разделов сайта и, например, получать информацию об установленных плагинах и темах, а также получать доступ к конфиденциальным данным или резервным копиям баз данных.. Чтобы проверить, какие каталоги видны извне, проще всего воспользоваться услугами Google. Достаточно запустить запрос типа site:example.com intitle: «index of» inurl: /wp-content/. Оператор inurl: Вы можете указать следующие каталоги:

/wp-content/
/wp-content/languages/plugins
/wp-content/languages/themes
/wp-content/plugins/
/wp-content/themes/
/wp-content/uploads/

Если вы можете просматривать /wp-content/plugins/, то следующий шаг сбора информации об установленных плагинах и их версиях значительно упрощается. Естественно, запретить индексацию можно с помощью файла robots.txt. Так по умолчанию он не входит в установочный пакет WordPress, его необходимо создать и закинуть самостоятельно в корневую директорию сайта. Мануалов по созданию и работе с файлом robots.txt довольно много, так что оставьте эту тему для себя. Приведу лишь один из возможных вариантов:

User-Agent: *
Disallow: /cgi-bin
Disallow: /wp-login.php
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/
Disallow: /wp-content/plugins/
Disallow: /wp-content/themes/
Disallow: /?author=*
Allow: /

Если файлы, хранящиеся в папке uploads, являются конфиденциальной информацией, добавьте в этот список строку: Disallow: /wp-content/uploads/. С другой стороны, в файле robots.txt не рекомендуется размещать ссылки на каталоги, созданные специально для хранения конфиденциальной информации. В противном случае вы тем самым облегчите задачу злоумышленнику, ведь это первое место, куда обычно все заглядывают в поисках «нямми».

Security-плагины для WordPress
  • Login LockDown – ограничивает количество неудачных попыток входа в систему;
  • Revisium WordPress Theme Checker — ищет типичные вредоносные программы в темах WordPress;
  • Sucuri Security — осуществляет мониторинг и обнаружение вредоносного кода;
  • IThemes Security (ранее Better WP Security) — для защиты мультиплагина WordPress;
  • BackUpWordPress — делает резервную копию файлов и баз данных;
  • Google Captcha (reCAPTCHA) — устанавливает капчу при регистрации, входе в систему, восстановлении пароля и в виде комментариев.
Подключить .htaccess

Для ограничения доступа к конфиденциальной информации лучше использовать файл .htaccess — это файл конфигурации, используемый веб-сервером Apache. Рассмотрим возможности файла с точки зрения безопасности. С его помощью вы можете: запретить доступ к каталогам и файлам, заблокировать различные SQL-инъекции и вредоносные скрипты. Для этого стандартного файла .htaccess для CMS WordPress 4.1 нужно немного расширить. Чтобы закрыть список файлов и папок, добавьте:

Options +FollowSymLinks -Indexes
 
RewriteCond %{QUERY_STRING} base64_encode[^(]*([^)]*) [OR]

Ссылки на блоки, содержащие кодировку Base64. Избавьтесь от ссылок, содержащих тег <script>:

RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]

Чтобы противодействовать сценариям, пытающимся установить глобальные переменные или изменить _REQUESTпеременную через URL:

RewriteCond %{QUERY_STRING} GLOBALS (=|[|%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST (=|[|%[0-9A-Z]{0,2})

Для противодействия запросам на блокировку SQL-инъекций по URL-адресу, содержащему определенные ключевые слова:

RewriteCond %{query_string} concat.*( [NC,OR]
RewriteCond %{query_string} union.*select.*( [NC,OR]
RewriteCond %{query_string} union.*all.*select [NC]
RewriteRule ^(.*)$ index.php [F,L]

Чтобы испортить жизнь обычным хакерским инструментам, фильтруют определенные юзер-агенты:

SetEnvIf user-agent «Indy Library» stayout=1
SetEnvIf user-agent «libwww-perl» stayout=1
SetEnvIf user-agent «Wget» stayout=1
deny from env=stayout
Защищает файлы

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

  • Wp-config.php, включает имя базы данных, имя пользователя, пароль и префикс таблицы;
  • .htaccess;
  • Readme.html и ru_RU.po, которые содержат версию WordPress;
  • Установить.php.

Это делается следующим образом:

<Files file_name>
Order Allow,Deny
Deny from all
</Files>

Файл .htaccess, содержащий эти строки, должен находиться в той же директории, что и защищенный файл. Затем не разрешаем перечисление пользователей (помните, чуть выше мы говорили о том, как просто получить список пользователей?):

RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]

Так что еще? Вы можете разрешить вход только с указанных IP-адресов. Для этого создайте файл .htaccess в вашей wp-admin со следующими правилами:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Access Control"
AuthType Basic
order deny,allow
deny from all
allow from 178.178.178.178  # IP Home computer
allow from 248.248.248.248  # IP Work computer

Метод не очень гибкий и применим только в том случае, если вы работаете с ограниченным количеством фиксированных IP-адресов. В противном случае рекомендуется установить пароль на папку wp-admin через хостинг (при наличии такой функциональности).

WWW

Набор правил 5G Blacklist и 6G Blacklist beta от Perishable Press, который позволяет бороться с распространенными вредоносными URL-запросами для WordPress.

Дополнительные меры

Помимо сказанного выше, можно добавить следующие рекомендации. Во-первых, используйте только последние версии WordPress и его компонентов — это устранит известные уязвимости. Во-вторых, удалить плагины и темы, которые тоже можно проэксплуатировать. В-третьих, загружайте темы и плагины WordPress из надежных источников, таких как сайты разработчиков и официальный сайт WordPress. Так же как и домашний ПК, вам необходимо периодически проверять веб-ресурс веб-антивирусом, например AI-Bolit. Если у вас есть доступ к веб-серверу, настроение прав доступа к файлам и каталогам. Обычно WordPress устанавливает полные права на этапе установки, но при необходимости можно установить вручную chmod. Для каталога — chmod 755, для файлов — chmod 644. Убедитесь, что права 777 назначены только тем объектам, которые в этом нуждаются (иногда это необходимо для нормальной работы некоторых плагинов). Если WordPress перестал нормально работать, поэкспериментируйте с правами доступа: сначала попробуйте 755, затем 766 и, наконец, 777. Для всех htaccess-файлов выставить chmod 444 (только чтение). Если сайт перестал работать, попробуйте поэкспериментировать со значениями 400, 440, 444, 600, 640, 644.

Переместите файл wp-config.php. Этот файл содержит информацию о настройках, MySQL, префиксе таблицы, секретных ключах и многом другом. Поэтому необходимо передать файл, чтобы он был недоступен из Интернета. Если сайт находится не в папке public_html, то перетащите файл wp-config.php в папку уровнем выше, и WordPress автоматически найдет его в корневом каталоге (применяется, если на данной CMS размещен только один сайт).

Чтобы усложнить кастинг оболочки, отключите возможность редактирования тем в консоли WordPress. Для этого вставьте в файл wp-config.php следующую строку:

define ('DISALLOW_FILE_EDIT', true) ;

Еще одно слабое место — файл install.php (в папке wp-admin). Поэтому лучше удалить, заблокировать или изменить. Выполните одно из следующих действий:

  1. Просто удалите этот файл — после установки он больше не нужен.
  2. Запретить доступ к файлу через .htaccess.
  3. Переименуйте исходный файл install.php (например, install.php.old) и создайте новый файл install.php со следующим содержимым:
<?php header("HTTP/1.1 503 Service Temporarily Unavailable"); ?>
<?php header("Status 503 Service Temporarily Unavailable"); ?>
<?php header("Retry-After 3600"); // 60 minutes ?>
<?php mail("[email protected]", "Database Error", "There is a problem with teh database!"); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="en"xmlns="http://www.w3.org/1999/xhtml"lang="en">
<head>
<meta http-equiv="Content-Type"content="text/html; charset=utf-8" />
<title>Error Establishing Database Connection</title>
</head>
<body>
<h1>Error Establishing Database Connection</h1>
<p>We are currently experiencing database issues. Please check back shortly. Thank you.</p>
</body>
</html>

Помимо уведомления посетителей сайта, этот скрипт делает следующее:

  • Отправляет заказчику и поисковым системам код статуса 503 («Сервис недоступен»);
  • Задает временной интервал, через который клиенты и поисковые системы могут вернуться на сайт (настраиваемый параметр);
  • Сообщите по электронной почте о проблеме с базой данных для принятия соответствующих мер.

Дело в том, что в более ранних версиях WordPress (<=2.7.1) при сбоях MySQL (например, DDoS-атака) CMS дает возможность переустановки. Кроме того, может произойти и неисправность/повреждение одной из таблиц WordPress. В частности, атака возможна при повреждении таблицы ks29so_options (в WordPress 2.6.2) или ks29so_users (в WordPress 2.0.3 и 2.0.11). То есть в разных версиях WP разные таблицы при главной проверке в установщике — это может быть либо таблица ks29so_options, либо ks29so_users.

Наконец, отключите регистрацию новых пользователей, если в этом нет необходимости. Если же предусмотрена онлайн-регистрация, позаботьтесь о том, чтобы новые пользователи после регистрации получили минимальные привилегии.

Полезные ссылки
Закрытие

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

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее