А чи в безпеці ваш сайт WordPress? ☣️ Діагностика зараження, лікування сайту та профілактика [оновлюється]
«Встановіть плагін Wordfence і спіть спокійно!» – такі поради часто лунають на сайтах, в чатах і т.д. А чи дійсно плагін приносить спокій? Це ніби заявити: “Їжте люди постійно моркву та лимон і ви ніколи не захворієте”… Це правда? [на обличчі саркастична усмішка]
Популярність WordPress
WordPress є найпопулярнішою платформою для створення веб-сайтів, що означає, що велика кількість веб-сайтів використовує даний двигунець. Ні одна в світі CMS не має такого розмаїття модулів та рішень і такої потужної підтримки зі сторони спільноти.
WordPress давно переріс стадію блогового двигунця і став не просто CMS, а модульним фреймворком з готовим API, на базі якого можна створювати сайти різних типів та складності. Бачу в декого саркастичну усмішку. Рекомендую прочитати книгу “Разработка веб-приложений на WordPress. WordPress как фреймворк“, автори Брайан Мессенленер, Джейсон Коулман.
Трішки статистики:
- Більше 43% всіх сайтів світу працюють на WordPress.
- Створено 11 769 безкоштовних тем WP та 59 567 безкоштовних плагінів WP.
- На платформі EnvatoMarket розміщено 11 971 тем WP та 5 195 плагінів WP.
Цифри красномовно говорять самі за себе. WordPress в топі!
Але, є і темна сторона популярності та слави.
Темна сторона популярності WordPress
Популярність WordPress, безумовно, призводить до збільшення уваги зі сторони зловмисників.
Зловмисники, спеціалізуючись на атаках, шукають масові цілі, і велика кількість встановлених копій WordPress стає привабливою метою:
- Велика кількість тем та плагінів WordPress створює масу потенційних вразливостей.
- Велика маса користувачів, які нехтують безпекою та гігієною в мережі.
- Не завжди достатня та вчасна підтримка продуктів зі сторони авторів. Ми не раз зустрічали плагіни, які пропустили 3 останні великі оновлення WordPress, або не підтримують PHP 8 і вище. Існують плагіни які все ще вимагають PHP 5.6, а дана версія є повільною і менш безпечною. Застарілі плагіни або теми можуть містити вразливості, які можна використовувати для несанкціонованого доступу.
- Нехтування користувачами оновлень WP, тем та плагінів. Багато власників веб-сайтів не завжди приділяють достатню увагу захисту своїх WordPress-сайтів, оновлюючи плагіни і ядро системи з затримкою або навіть ігноруючи ці процеси. Це створює додаткові можливості для зловмисників використовувати вразливості.
- Плагіни безпеки не панацея.
- Погіршення політичної атмосфери у світі, що також впливає на безпеку і створює різноманітні ризики.
Ваші сайти завжди знаходяться під прицілом! Тільки комплексні рішення, знання і розуміння своїх дій знижують ризики.
Отже, популярність WordPress робить його привабливим об'єктом для атак і важливо, щоб власники веб-сайтів приділяли достатню увагу заходам безпеки для уникнення неприємних інцидентів.
З якою метою роблять злом сайту? Мотиви
- Самореалізація
- Усунення конкурентів та політичних опонентів
- Порушення роботи інфраструктури
- Демонстрація сили
- Декларування певних ідей та протестів
- Викрадення інформації та ресурсів
- Спам та реклама
- Чорне SEO – найбільш популярний мотив, який я зустрічав в своїй роботі.
Напишіть в коментарях, які ще можуть бути причини зломів сайтів.
В моїй роботі, мається на увазі в роботі по захисту сайтів, найбільш поширеною причиною злому сайтів було застосування чорного SEO. Тобто, ваш сайт використовують, щоб просувати в пошукових системах контент, посилання, або сторонні сторінки інших сайтів.
Яскравим прикладом такої мети є використання японського вірусу. На сайті створюються тисячі нових сторінок з посиланнями. Ці сторінки заповнюють пошукову видачу та витісняють нормальні сторінки. Такий собі вірус-паразит. Якщо вчасно не відреагувати, то сайт потрапляє в чорні бази (блеклісти) як ненадійний, і навіть Google його помічає таким. Далі, сайт випадає взагалі з результатів пошуку і втрачає повністю трафік. В результаті сайт поступово помирає, тому що чорне SEO висмоктує з нього всю енергію, яку сайт накопичував на протязі багатьох років. Щоб відновити трафік та рейтинг сторінок потрібні місяці. Є ймовірність, що сайт вже більше ніколи не оговтається. В цьому випадку краще зареєструвати новий домен.
Методи злому сайтів WordPress
Спершу зловмисник збирає дані про сайт.
А саме:
- Інформація про адміна та користувачів
- Інформація про плагіни
- Інформація про теми
- Досліджується сторінка контакти, сторінка автора, сторінка авторизації
- Можуть досліджуватися каталоги сайту, на предмет їх публічного перегляду
Для збору такої інформації зловмисник в більшості випадків використовує автоматизацію за допомогою спеціального програмного забезпечення (роблю такий висновок на основі серверних логів). Список сайтів береться з публічного простору та різних каталогів.
Досліджуючи логи серверу, на якому знаходились заражені сайти, я помітив, що пошук, різні запити та експлуатація вразливостей займає декілька хвилин, що говорить нам про автоматизацію процесу. Найчастіше саме ваш сайт не є конкретною ціллю. Зловмисник відсканував відкриті бази сайтів і проводить їх аналіз за допомогою програмного забезпечення.
В основному, зловмисники для злому сайтів використовують вразливості в плагінах WordPress. Тому, їхня головна ціль – це визначити список плагінів та їх версії.
Як визначити список плагінів та їхні версії? (основні методи)
- Аналіз вихідного коду головної сторінки – плагіни залишають сліди (коментарі, генератори, посилання на власні файли). Цей метод використовують різноманітні білі онлайн-сервіси.
- Перебір списку readme.txt – більшість плагінів в своїх кореневих папках містять такий файл. В цьому файлі зазначається назва та версія плагіна. Такий перебір файлів виконують в автоматичному режимі. Через GET-запроси на сайті шукають текстові файли і через пінг по відповіді 200 визначають їх наявність.
- Аналіз REST API: публічних кінцевих точок. Це дає зловмиснику інформацію про адміна, про теми, плагіни і інші технології, що використовуються на сайті. Що таке REST API? – В кінці публікації залишив корисні посилання.
Спробуйте в адресному рядку до домену додати наступне:
wp-json/wp/v2
wp-json/wp/v2/users/
Що видав браузер? Якщо вся сторінка заповнена інформацією, то на вашому сайті публічні кінцеві точки відкриті для публічного доступу. Я рекомендую їх закривати, якщо до сайту не підключена CRM чи якась інша інтеграція. До речі, можна вибірково вимикати такі публічні кінцеві точки, щоб не порушувати обмін інформацією з вашим сервісом.
Методи злому
Після аналізу сайту і виявлення слабких місць підбирається метод злому та інструменти. Для кожної вразливості використовуються свої методики злому.
При експлуатації вразливості на сайт завантажується як правило бекдор. А бекдор далі дає можливість отримати доступ до файлів сайту та БД. А далі зловмисник робить, що душа його забажає. Рівень маскування та захисту заражених файлів може бути 1-рівнем та багаторівневим. Коли, код бекдору знаходиться не тільки в плагіні, але і в активній темі.
Методи злому:
Brute force атака – це метод зламу, при якому зловмисник систематично намагається перебрати всі можливі комбінації паролів, доки не знайде правильний пароль. Використовується скрипт або програма. Тут використовується незахищеність сторінки авторизації.
SQL-ін'єкція – сайт на WordPress зберігає свої дані в базі даних MySQL. При цій атаці тестуються усі веб-елементи на сайті, в які можна вводити запити. Наприклад, форми авторизації, форма пошуку, форма зворотного зв'язку. Форма підписки, форма коментування та завантаження файлів. Скануються також плагіни та теми на наявність таких вразливостей.
Поле форми не перевіряє і не фільтрує вхідні дані, це дозволяє зловмиснику вводити SQL-код у запити до БД. Команда виконується і відбувається певна дія.
XSS (Cross-Site Scripting) атака – це вид атаки на веб-додатки, при якій зловмисник вставляє шкідливий код на веб-сторінку, який потім виконується у браузері користувача.
Також, використовуються різні форми, які не фільтрують вхідні дані. Довільний код зберігається в базі даних і таким чином вставляється на обрані сторінки (сторінки, публікації). Це можуть бути посилання, редиректи, заміна контенту, перехоплення даних.
LFI/RFI/RCE-атаки
Зловмисник аналізує всі URL з параметрами, щоб мати змогу завантажити свій файл з кодом. Його файл може мати різні розширення і маскуватися під нормальні звичайні файли, наприклад зображення. Пошук вразливих сайтів може відбуватись з використанням пошукових операторів Google.
LFI (Local File Inclusion) – це тип атаки, при якій зловмисник намагається отримати доступ до локальних файлів на сервері. Зловмисник намагається вплинути на обробку вхідних даних таким чином, щоб сервер сприймав їх як шлях до локального файлу і включав його в вихідну відповідь.
Я зустрівся з таким випадком ще в 2014 році. В папці активної теми були файли social.png, social0.png, social1.png з стороннім кодом.
RFI (Remote File Inclusion) – це тип атаки, при якій зловмисник може виконати свій код або отримати доступ до чутливої інформації на сервері через зовнішній файл.
RCE (Remote Code Execution) – це тип атаки, що дозволяє зловмиснику виконувати команди операційної системи або запускати віддалені програми на скомпрометованому сервері.
CSRF (Cross-Site Request Forgery) атака – це вид атаки на веб-додатки, при якій зловмисник змушує автентифікованого користувача виконати небажані дії без його згоди або відомості. Ця атака використовує довіру, яку веб-додаток має до запитів, що надсилаються від автентифікованого користувача.
Користувачу пропонується фальшивий сайт з певними діями, які йому необхідно виконати. На фальшивому сайті при натисканні на посилання йде звернення на інший сайт, на якому користувач автентифікований. Там відбуваються дії в його обліковому записі. Сервер ці дії не сприймає як шкідливі, бо це виглядає ніби це робить сам користувач. Таким чином, викрадаються кошти, відбувається перехоплення облікового запису, видалення даних і т.д. Прикладом можуть бути фальшиві сторінки, які маскуються під OLX або OLX-доставку, банки, популярні сервіси іт.д.
Ось чому не слід переходити по різним незнайомим, сумнівним посиланням. Такі посилання вам можуть приходити на пошту від ніби сервісів, якими ви користуєтесь, або їх можуть надсилати вам ваші Facebook-друзі.
SSRF (Server-Side Request Forgery) – це атака на веб-додаток, при якій зловмисник змушує сервер виконати небезпечний HTTP-запит з контекстом внутрішньої мережі або зовнішніх ресурсів, використовуючи вразливість веб-додатку.
Nulled-продукти
Зловмисник отримує доступ до сайту через попередньо заражені теми та плагіни WP, які власник сайту або розробник встановили на сайті. Поширений метод, розрахований на любителів халяви і людей, які не бажають платити за продукт/ліцензію. Такі теми та плагіни, як правило, завантажуються на різних сайтах-каталогах продуктів. Ми їх ще називаємо пабліки, інфо-смітники, варезники і т.д.
Чому продукти називаються Nulled-продукти? Тому що хтось в коді таких продуктів вимкнув/видалив механізм перевірки ліцензії і таким чином розблокував повністю або частково функціонал. “І що в цьому поганого? Де тут небезпека для сайту?” – запитає мій читач. Небезпека заключається в тому, що в кодовій базі такого продукту може бути присутній не тільки код блокування ліцензії, але і бекдор, приховані посилання та редиректи, шкідливий код, який дає можливість отримати доступ до адмінки сайту і його файлів. Захотілося халяви? – Отримуйте зараження!
Симптоми зараження сайту
- Втрата доступу до адмінки сайту.
- Дефейс (заміна контенту) головної сторінки.
- Редиректи на інші сайти.
- 404 і 500 помилки.
- Заміна контенту, поява нових віджетів в сайдбарі, поява посилань та реклами.
- Нові користувачі-адміни (явні і приховані).
- Повідомлення служби підтримки по спам, про підозрілі файли та навантаження.
- Повільна робота сайту.
- “Білий екран” на сторінках сайту.
- Зміна кодування файлів. Наприклад з UTF-8 на UTF-7.
Це тільки деякі приклади.
Діагностика злому
Цей етап є дуже відповідальним.
Завдання діагностики:
- Підтвердити зараження.
- Визначити ступінь зараження, з чим ми маємо справу.
- Визначити наслідки зараження.
Діагностика дозволяє розробити стратегію захисту та профілактики. Ваша помилка чи поверхневе занурення в проблему може призвести до повторного зараження чи ускладнення наслідків.
Методи діагностики
1.Перевіряю чи дійсно є симптоми. Збираю анамнез (коли людина помітила симптоми, що робила до цього, які плагіни ставила і кому давала доступи). Вивчаю повідомлення від служби підтримки.
2.Перевіряю адмінку: теми, плагіни і користувачів, щоб побачити загальну картину та визначити версії продуктів.
3.Аналізую сайт через сервіси (див. далі).
4.Визначаю (через сервіси) чи потрапив сайт до чорних списків.
5.Читаю логи на сервері: access.log та error.log
6.Через FTP або файловий менеджер перевіряю дати папок та файлів. Переглядаю всі кореневі папки, папку з плагінами та темами. Визначаю не тільки зміни в датах, але візуально визначаю наявність підозрілих файлів.
7.Аналізую результати видачі в пошуковій системі.
8.Пошук шкідливих скриптів за допомогою серверних антивірусів (по типу Айболіт) та плагінів-сканерів (Quttera Web Malware Scanner, Anti-Malware Security and Brute-Force Firewall).
Онлайн-сервіси для сканування сайтів
- https://quttera.com/website-malware-scanner
- https://2ip.io/ua/site-virus-scaner/
- https://www.virustotal.com/gui/home/url
- https://sitecheck.sucuri.net/
- Malcure.com
Читання логів (журналів на сервері)
Читання логів може зайняти багато часу, атака могла відбуватися з різних IP і атакуючий здійснював спроби на протязі 5 останніх днів, а це тисячі рядків в логах. Але, логи на мій погляд, допомагають побачити всю картину злому та визначити слабкі місця. Для читання та сортування даних можна використовувати різне ПЗ.
Через логи ми бачимо як діяв зловмисник:
- Запит /wp-json/
- Спроба авторизації, щоб побачити повідомлення про помилки
- Визначення плагінів через readme.txt і простір імен
- Експлуатація вразливості в плагіні
- Завантаження файлів – яких і куди
- Запити: які, звідки, відповідь серверу (200, 404, 401, 301)
Шкідливі файли я найчастіше знаходив в кореневій папці WP, wp-includes та wp-content/uploads. А шкідливий код знаходив в таких файлах: index.php, .htaccess, wp-config.php, в файлах wp-includes, functions.php і в файлах тем та плагінів.
Аналіз БД
Додатково потрібно завантажити дамп БД на комп'ютер і через пошук спробувати знайти фрагменти (сигнатури) шкідливих скриптів та функцій.
Лікування сайту WordPress після зараження шкідливими скриптами
Тут є швидкий та тривалий ручний метод. Інструменти боротьби на хостингу також можуть допомогти очистити сайт від шкідливих скриптів.
Швидкий метод (відновлення з бекапу)
- Відновлення сайту з резервної копії (здорова копія).
- Очистіть папки з кешем.
- Зміна всіх паролів.
- Повторна діагностика сайту (див. вище методи діагностики). Перевірте чи пропали симптоми зараження.
Ручний метод очищення
- Видаляємо папки wp-admin, wp-includes та кореневі файли WP (крім wp-config.php). Завантажуємо чисті файли.
- Очистіть папки з кешем.
- Вручну видаляємо сторонній код зі всіх файлів.
- Видалення чужих адмінів та зміна паролів.
- Видалення зайвих плагінів.
- Очищення БД від шкідливого коду (пошук сигнатур, по типу eval).
- Повторна діагностика. Перевірте чи пропали симптоми зараження.
Відео: Діагностика, лікування та профілактика зараження сайтів
В цьому відео я даю поради як виявити злом/зараження сайту, провести комплексну діагностику, як очистити сайт від шкідливого коду та захистити сайт від повторного зараження.
Відео розраховане на широку аудиторію. Я не претендую на експертність, просто ділюсь власним досвідом і висловлюю власні суб'єктивні думки. Моя ціль підштовхнути вас більш глибше досліджувати дану тему.
Це запис онлайн-конференції яка відбулась 23 січня 2024 року.
00:00 Вступ.
00:15 Популярність WordPress. Темна сторона популярності.
05:18 А чи в безпеці ваш сайт WordPress?
08:35 З якою метою зламують сайти? Мотиви.
15:29 Зловмисник перед зломом аналізує сайт.
17:34 REST API: публічні кінцеві точки. Як зловмисник збирає інформацію.
26:54 Пошук вразливостей шляхом аналізу файлів readme.txt.
30:17 Методи злому/зараження сайтів.
44:23 Симптоми зараження сайту.
46:48 Діагностика злому. Пошук шкідливого коду.
58:43 Лікування сайту, очищення від шкідливих скриптів.
1:04:45 Профілактика зараження. Моніторинг вразливостей.
1:15:43 Чи небезпечно використовувати Nulled-продукти?
1:22:48 Плагіни безпеки.
Плагіни безпеки
Плагіни безпеки WordPress
Плагіни безпеки для постійного повсякденного використання.
Wordfence Security – комплексний захист. Самий популярний плагін безпеки (найбільше користувачів в США), але з 2018 року плагін почав втрачати свої позиції.
Sucuri Security – комплексний захист.
Solid Security (стара назва iThemes Security) – комплексний захист.
RSFirewall! – плагін безпеки, не навантажує сайт, в базовій версії має необхідні параметри для захисту. Рекомендую, мій вибір!
BBQ Firewall – відсікає різні шкідливі запити (запити з небезпечними символами, надто довгі запити, sql-, php-, js-ін'єкції, XSS-атаки, XXE-атаки, поганих ботів і т.д.). Можна поєднувати з іншими плагінами безпеки.
Плагіни WordPress для сканування файлів та моніторингу вразливостей
Дані плагіни-сканери рекомендую використовувати для пошуку заражених файлів і вразливих плагінів. Такі плагіни зручно використовувати на стадії діагностики.
MalCare WordPress Security Plugin – сканер, фаєрвол, показує вразливі плагіни, але, не показує які файли заражені. Потрібна реєстрація на сайті.
Patchstack Security – фаєрвол, показує вразливі плагіни. Випускає миттєві віртуальні патчі безпеки, щоб зловмисник не зміг використати вразливість, доки її не пофіксить автор продукту. Основна робота відбувається на стороні сервісу в особистому кабінеті, а на сайті необхідно встановити плагін-інтегратор.
Quttera Web Malware Scanner – внутрішній та зовнішній сканер, сканер з високою чутливістю. Не потребує реєстрації на сервісі. Можна запустити перевірку на їхньому сайті. Потужний сканер, який знаходить те, що не побачили інші онлайн-сканери. Рекомендую!
Anti-Malware Security and Brute-Force Firewall – швидкий сканер та сканер з повільним скануванням сайту. Не потрібно реєструватися на сервісі. Є базові налаштування фаєрволу. Знаходить шкідливі файли. Рекомендую!
Плагіни WordPress для захисту сторінки авторизації
Limit Login Attempts Reloaded – обмеження кількості потворних спроб авторизації, блокування користувача по IP після певної кількості невдалих спроб, сповіщення та журнали. Популярний, рекомендую!
Login Lockdown – захист сторінки авторизації, блокування користувачів. В платній версії є хмарний захист, тимчасовий доступ, блокування ботів та користувачів з певних країн. Потужний плагін, рекомендую!
Рекомендації по безпеці або профілактика зараження
- Версія PHP від 8.
- Увімкніть антивірус на хостингу.
- Використовуйте складні паролі.
- Регулярно оновлюйте WP, теми та плагіни.
- Регулярне резервне копіювання.
- Приховуйте версію WP та скриптів. Видаляємо тег generator в коді (для WP, Woo, Elementor…).
- Завантажуйте теми та плагіни з надійних ресурсів (бажано офіційних).
- Не тримайте в адмінці неактивні теми та плагіни, без особливої необхідності.
- Змініть права доступу до файлу wp-config.php на 444, також його можна перенести в директорію вище.
- За допомогою файлу .htaccess можна заборонити доступ до файлів wp-config.php та .htaccess.
- Якщо ви єдиний адмін-користувач на сайті, то є сенс дозволити доступ в адмінку з певної IP-адреси. Також, на сторінці авторизації можна приховати помилки, або задати загальне малоінформативне повідомлення.
- Зміна префіксу таблиць БД. Наприклад з wp_ на myprefix_
- Зміна URL-адреси сторінки авторизації. Замість /wp-admin/ та /wp-login/ буде інший слаг.
- Обмеження на кількість невдалих спроб введення паролю. Моментальне блокування при спробі ввести логін “admin”. Але, це при умові, що ми не є тим admin-ом.
- Двохфакторна авторизація.
- Видаліть readme.html і license.txt в корені сайту. Але, при оновленні WP вони знову з'являться.
- Вимикаємо xmlrpc.php і pingbacks.
- Вимикаємо режим Debug на сайті.
- Обмежити доступ до публічних REST API. Обов'язково тестуємо роботу сайту після того.
- Вмикаємо заголовки безпеки (Security Headers).
- Забороніть редактор тем та встановлення плагінів.
- Для розробників створюйте окремі облікові записи, або генеруйте тимчасові доступи в адмінку по посиланню.
- Для редакторів та авторів створюємо окремі облікові записи з відповідними ролями.
- Контроль прав доступу до файлів та папок (644 та 755 відповідно).
- Заборона на перегляд директорій в браузері.
- Відключити вбудований планувальник завдань WP-CRON, активувати серверний cronjob. Як рекомендація.
- Використовуйте плагіни безпеки (читайте далі).
- Відслідковуємо новини про знайдені вразливості (див. Трекери вразливостей).
Трекери вразливостей
- Загальна статистика по вразливостям.
- Трекер вразливостей тем та плагінів WP від patchstack.com.
- Трекер вразливостей WP від wpscan.com.
- Трекер вразливостей тем WP від wpscan.com.
- Трекер вразливостей плагінів WP від wpscan.com.
- Трекер вразливостей від Wordfence.
Рекомендації для розробників тем та плагінів WP
- Виконуйте належну перевірку та фільтрацію будь-яких вхідних даних. Використовуйте функції, такі як filter_input() або sanitize_text_field() для очищення вхідних даних.
- Замість використання include() або require() для включення зовнішніх файлів, використовуйте функції, такі як include_once() або require_once(). Вони перевіряють, чи файл вже був включений, щоб уникнути повторного включення.
- Використовуйте валідатори та аудитори коду: Використовуйте інструменти, такі як PHP CodeSniffer або PHPStan, для перевірки свого коду на наявність потенційних уразливостей та дотримання кращих практик безпеки.
- Приділіть увагу захисту API та Ajax ресурсів.
- Перевірка джерела запиту: Перевіряйте джерело запиту, щоб впевнитися, що запити на виконання важливих дій походять від власного веб-сайту. Перевіряйте $_SERVER[‘HTTP_ORIGIN'] або використовуйте функції, такі як wp_get_referer(), щоб перевірити джерело запиту.
- Використання CSRF-токенів: Додайте CSRF-токени до всіх форм та запитів, які виконують важливі дії, такі як зміна пароля або видалення облікового запису.
- Регулярно оновлюйте власні продукти.