Якщо ви отримали від мене лист із посиланням на цю сторінку, то це тому, що ваш сайт, вочевидь, використовує версію Bookly (плагін WordPress для запису на послуги bookly-responsive-appointment-booking-tool), яка потрапляє в діапазон, уражений відомою проблемою безпеки. Ця сторінка пояснює, у чому річ, як перевірити свою версію, як оновитися та який один крок варто зробити після оновлення.

Ідеться про CVE-2026-13395 – SQL-ін’єкцію без автентифікації в публічному сценарії запису. Уражені версії з 11.3 до 27.7; виправлено у 27.8, випущеній 10 липня 2026 року. Якщо у вас уражена версія, оновіть Bookly до 27.8 або новішої (27.9 – поточний випуск, він теж містить виправлення). Немає жодних ознак того, що цю проблему експлуатують ні проти вашого сайту, ні будь-де ще: ця сторінка – застереження з обережності, а не звіт про інцидент.

На відміну від деяких інших моїх повідомлень, це не залежить від налаштувань вашого сайту. Щоб уразливість була досяжною, не потрібно вмикати жодну опцію: уражений шлях запиту відкритий для неавторизованих відвідувачів на звичайній інсталяції. Якщо ваша версія Bookly потрапляє в уражений діапазон, оновитися варто швидко.

Це вразливість плагіна, а не ядра WordPress. Повністю оновлений WordPress не захистить вас, якщо сам плагін Bookly лишається на ураженій версії.

Чи справжнє це повідомлення?

Так. Це добросовісне повідомлення в межах відповідального розкриття від незалежного дослідника безпеки. Я не прошу у вас грошей, паролів чи доступу до сайту і не намагався до нього проникнути, щось йому надіслати чи щось експлуатувати.

Я лише переглянув загальнодоступні файли, які ваш сайт віддає кожному відвідувачеві (так само, як публічною є ваша головна сторінка), і занотував номер версії, який публікує плагін Bookly. Зокрема, я нічого не надсилав ані до вашої форми запису, ані на уражений шлях запиту, і ця перевірка не торкається ні ваших даних, ні панелі адміністрування, ні будь-якої закритої частини сайту (докладніше в розділі Що я робив і чого не робив).

Якщо ви хочете перевірити, хто я, контактні дані наведено внизу цієї сторінки та на сторінці Про мене.

Чому це важливо

Bookly – один із найпоширеніших плагінів запису на послуги для WordPress: він в офіційному каталозі з 2014 року й працює на десятках тисяч сайтів. Він публікує на відкритій частині сайту форму запису, у якій відвідувачі обирають послугу, працівника й час, не створюючи облікового запису.

В уражених версіях одне зі значень, які ця форма надсилає назад, – ідентифікатор обраного відвідувачем працівника – зберігається саме в тому вигляді, у якому надійшло, без перевірки, а згодом підставляється просто в запит до бази даних замість передавання як параметр. Той, хто надішле підготовлене значення замість звичайного ідентифікатора, може в такий спосіб змінити зміст цього запиту. Практичний наслідок: людина без облікового запису й без входу могла б прочитати з бази даних вашого сайту дані, які запит ніколи не мав повертати, зокрема хеші паролів ваших облікових записів WordPress.

Дві речі варто сказати прямо – в обидва боки.

По-перше, про співмірність: це проблема читання даних, а не захоплення сервера чи облікового запису адміністратора. Сама по собі вона не дозволяє виконати код на сервері чи увійти в панель адміністрування. Хеш пароля – не пароль: його ще треба зламати, щоб він перетворився на доступ. І свідчень експлуатації немає: організація, що присвоїла CVE, не опублікувала оцінки серйозності, проблеми немає в каталозі KEV американського агентства CISA, її показник ймовірності експлуатації (EPSS) не присвоєно, і мені не відомо про жодні повідомлення про експлуатацію.

По-друге, без применшення: між анонімним відвідувачем і цим шляхом не стоїть ані вхід у систему, ані nonce, ані будь-яке налаштування плагіна. Він досяжний на типовій інсталяції безкоштовного плагіна. Саме тому рекомендація – оновитися найближчим часом, а не відкладати до наступного технічного вікна.

Якщо в моєму листі згадувалася ця проблема, то версія, про яку повідомляє ваш сайт, потрапляє в уражений діапазон. Я не перевіряв, чи вразливий саме ваш сайт; я спостерігав лише версію.

Чи стосується це мене?

Усе зводиться до одного питання: яка у вас версія Bookly? Вірити мені на слово не треба – перевірити можна двома способами.

У панелі адміністрування WordPress (головне джерело):

  1. Увійдіть до консолі WordPress (зазвичай вашдомен.ua/wp-admin).
  2. Перейдіть до Плагіни, потім Встановлені плагіни.
  3. Знайдіть Bookly – запис, тека якого називається bookly-responsive-appointment-booking-tool, – і подивіться версію під назвою.

З публічного маніфесту (без входу): відкрийте у браузері вашдомен.ua/wp-content/plugins/bookly-responsive-appointment-booking-tool/readme.txt. Рядок Stable tag: ближче до початку – це версія, про яку повідомляє ваша інсталяція; саме цей публічний файл я й читав.

Далі застосуйте правило, пам’ятаючи, що версії порівнюються числово, а не за абеткою:

  • З 11.3 до 27.7: уражена. Оновлюйтеся зараз.
  • 27.8 або новіша: уже виправлена. Сюди належить і 27.9, яка зберігає виправлення.
  • Старша за 11.3: цією проблемою не уражена. Небезпечної конструкції запиту в тих випусках не було – ідентифікатори працівників проходили через параметризований конструктор запитів плагіна. У такого старого випуску вистачає інших причин для оновлення, але це повідомлення до них не належить.
  • Не читайте номери версій як текст. У Bookly двозначний старший номер, тож текстовий порядок помиляється двічі: 3.3 виглядає більшим за 27.8, хоча значно старіше, а 27.10 виглядає меншим за 27.7, хоча новіше. Порівнюйте число за числом.

Про доповнення Bookly. Платні розширення Bookly (Pro та різні пакети bookly-addon-*) встановлюються як окремі плагіни з власними номерами версій, а адреси їхніх файлів можуть нести версію основного плагіна замість власної. Для цього повідомлення важлива версія основного плагіна Bookly, отримана одним із двох способів вище, – а не число, зчитане з файлів доповнення.

Якщо ззовні ви не бачите файлів Bookly. У Bookly є налаштування, яке визначає, чи завантажуються його скрипти й стилі на кожній сторінці, чи лише на сторінках із формою запису. Якщо у вас обрано другий варіант, ззовні видно значно менше. Це налаштування впливає тільки на те, що відвідувач може побачити, – воно не визначає, чи присутня вразливість і чи є вона досяжною. Перевірте версію в панелі адміністрування.

Як оновитися

Найнадійніше оновлюватися засобами самого WordPress, попередньо зробивши резервну копію:

  1. Зробіть резервну копію сайту (файли й база даних) до будь-яких змін. Більшість хостингів пропонують копії в один клік, або скористайтеся плагіном резервного копіювання.
  2. У панелі WordPress перейдіть до Консоль, потім Оновлення, або до Плагіни та Встановлені плагіни. Якщо оновлення Bookly пропонується, встановіть його звідти.
  3. Якщо зручніше в командному рядку, WP-CLI робить те саме: wp plugin update bookly-responsive-appointment-booking-tool.
  4. Якщо оновлення не з’являється, останній випуск можна взяти просто зі сторінки плагіна в каталозі WordPress.org, Bookly, і оновитися через Плагіни, Додати плагін, Завантажити плагін.
  5. Після оновлення переконайтеся за кроками вище, що номер версії новий (27.8 або вищий), і перевірте, що форма запису та наявні записи працюють нормально.

Якщо ви користуєтеся платними доповненнями Bookly, оновіть їх разом з основним плагіном – їхні випуски зазвичай узгоджені.

Заразом варто переконатися, що ядро WordPress та інші плагіни актуальні: той самий принцип стосується всіх.

Після оновлення

Перехід на 27.8 або новішу закриває проблему, і ознак її експлуатації будь-де немає, тож жодного екстреного реагування не мається на увазі: вважати сайт скомпрометованим або вимикати його не потрібно.

Один подальший крок усе ж варто саме виконати, і він випливає прямо з того, до чого могла дотягнутися ця вразливість. Оскільки хеші паролів WordPress були серед даних, які міг повернути запит, а здобутий раніше хеш лишається корисним зловмиснику й після вашого оновлення, розумний запобіжний захід – після встановлення оновлення скинути паролі облікових записів адміністраторів. До цього природно додати два менші кроки:

  • Перегляньте облікові записи адміністраторів і редакторів на предмет незнайомих – так само, як ви зазвичай переглядаєте доступ до сайту.
  • Перегенеруйте секретні ключі та «солі» WordPress у wp-config.php (нові значення – в один клік в офіційному генераторі; їх заміна одноразово завершить сеанси всіх користувачів).

Поставтеся до цього як до звичайної гігієни безпеки, а не як до реагування на інцидент.

Що я робив і чого не робив

Щоб бути цілком прозорим щодо перевірки, на якій ґрунтується мій лист: я читав лише публічні файли, які ваш сайт і так віддає кожному відвідувачеві, а саме публічний readme.txt плагіна Bookly і вашу головну сторінку. Я не звертався ні до панелі адміністрування WordPress, ні до бази даних, ні до будь-якої закритої частини сайту.

Зокрема, я ніколи нічого не надсилав ані до вашої форми запису, ані на уражений шлях запиту – нічого не надсилалося, не тестувалося й не експлуатувалося. Тут це важить більше, ніж на більшості таких сторінок: вразливість і є неавтентифікованим запитом за цим шляхом, тож «я його не торкався» – уся різниця між розкриттям і вторгненням.

Це спостереження за версією: ваш сайт повідомляє версію з ураженого діапазону. Сайт у цьому діапазоні може бути вже захищений іншим чином – наприклад, міжмережевим екраном рівня застосунків або перенесеним виправленням. Це повідомлення не стверджує, що ваш сайт був вразливим у момент перевірки.

У мене немає вебмайстра / я не даю ради

Якщо сайтом опікуєтеся не ви, перешліть, будь ласка, цю сторінку тому, хто ним опікується (вашому розробнику, агенції або хостинг-провайдеру). Кроки вище він упізнає одразу.

Якщо ви ведете сайт самі й застрягли, я радо підкажу напрямок безкоштовно. Напишіть за контактами нижче.

Контакти

Evan Harris, дослідник безпеки

Я звертаюся з такими питаннями винятково для того, щоб допомогти операторам захистити свої сайти. Якщо ви волієте більше не отримувати від мене листів, просто скажіть – я це врахую.

Джерела

Офіційні бюлетені та відстеження

Розробник / плагін