Повідомлення про безпеку Drag and Drop Multiple File Upload for Contact Form 7
Якщо ви отримали від мене лист із посиланням на цю сторінку, то це тому, що ваш сайт, вочевидь,
використовує версію Drag and Drop Multiple File Upload for Contact Form 7 (плагін WordPress, який
на WordPress.org зазначено під цією назвою, автор codedropz, і який лежить у ваших файлах за
шляхом /wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/), яка потрапляє в
діапазон, уражений відомою проблемою безпеки. Ця сторінка пояснює, у чому полягає проблема, як
визначити, чи стосується вона взагалі вашого сайту, як прочитати свою версію, не давши себе ввести в
оману, і як оновитися.
Зверніть увагу: це не версія для WooCommerce. Той самий автор публікує окремий плагін, “Drag and
Drop Multiple File Upload for WooCommerce” (тека drag-and-drop-multiple-file-upload-for-woocommerce),
який є окремим продуктом зі своєю власною нумерацією версій. Якщо плагін у ваших файлах є версією для
WooCommerce, а не для Contact Form 7, ця сторінка не про нього. Усе нижче стосується виключно
доповнення для Contact Form 7.
Перш за все, найважливіший факт про це повідомлення: сама лише версія з ураженого діапазону ще не означає, що ваш сайт вразливий. Описана нижче проблема виникає лише на сайтах, які мають певний тип поля завантаження, а я не можу ззовні побачити, як налаштовані ваші форми:
- Проблема досяжна лише через форму Contact Form 7, у якій одне з полів завантаження методом перетягування цього плагіна налаштоване на прийняття файлів будь-якого типу.
- Поле, яке обмежує типи файлів, що приймає (наприклад, лише зображення чи PDF), не вразливе до цієї проблеми, навіть на ураженій версії. Обмеження типів, що приймаються, також є типовою поведінкою, коли поле не вказує їх явно.
Я можу прочитати версію вашого плагіна з публічного файлу, але не можу прочитати налаштування вашої форми, тож це повідомлення є радше запобіжним попередженням, ніж підтвердженим висновком про ваш сайт.
Проблема має ідентифікатор CVE-2026-18781: це вада завантаження файлів без автентифікації в обробці завантажень плагіна. Вона стосується версій із 1.3.9.3 по 1.3.9.8 і виправлена у 1.3.9.9. Якщо у вас працює уражена версія, оновіть Drag and Drop Multiple File Upload for Contact Form 7 до 1.3.9.9 або новішої версії, а також підтримуйте в актуальному стані сам Contact Form 7.
Кілька слів про терміновість, оскільки це умовне повідомлення. Якщо жодне з ваших полів завантаження не приймає файли будь-якого типу, оновлення є звичайним обслуговуванням плагіна. Якщо ж хоча б одне приймає, розгляньте оновлення як пріоритет: за такого налаштування вада могла б дозволити відвідувачу без жодного облікового запису зберегти на вашому сервері файл на власний вибір, такого типу, який сервер потім міг би виконати, що може призвести до повного контролю над сайтом.
Це вада плагіна, а не ядра WordPress, і вона не пов’язана із самим Contact Form 7. Повністю оновлений WordPress та оновлений Contact Form 7 не захистять вас, якщо це доповнення має уражену версію.
Чи справжнє це повідомлення?
Так. Це добросовісне повідомлення в межах відповідального розкриття від незалежного дослідника безпеки. Я не прошу у вас грошей, паролів чи доступу до сайту і не намагався до нього проникнути, надіслати якусь із ваших форм чи щось на нього завантажити.
Я лише переглянув загальнодоступні файли, які ваш сайт віддає кожному відвідувачеві (так само, як публічною є ваша головна сторінка), і занотував номер версії, який публікує плагін. Я свідомо не надсилав жодної форми, не завантажував файл і не наближався до обробника завантажень плагіна. Ця перевірка жодним чином не торкається ваших даних, вашої панелі адміністрування чи будь-якої закритої частини сайту (докладніше нижче, у розділі Що я робив і чого не робив).
Якщо ви хочете перевірити, хто я, контактні дані наведено внизу цієї сторінки та на сторінці Про мене.
Чому це важливо
Цей плагін додає до форм Contact Form 7 поля завантаження файлів методом перетягування, тож відвідувачі можуть долучати файли, надсилаючи форму: заявку на роботу, звернення до підтримки, фотографію. Щоб це було безпечно, плагін має відхиляти небезпечні типи файлів.
В уражених версіях цю перевірку можна було обійти. Плагін аналізував назву завантаженого файлу, щоб вирішити, чи дозволений тип файлу, потім змінював назву і зберігав файл без повторної перевірки зміненої назви. Оскільки назва змінювалася вже після схвалення, її можна було підібрати так, щоб перевірена версія виглядала безпечною, а фактично збережена версія такою не була, що дозволяло недозволеному типу файлу потрапити на сервер. Якщо сервер потім сприймає такий файл як щось, що можна виконати, результатом стає те, що на вашому сайті виконується файл стороннього.
Звідси випливають дві речі, і вони тягнуть у протилежних напрямках. Перша: це має значення лише там, де форма має поле завантаження, налаштоване на прийняття файлів будь-якого типу. Там, де кожне поле завантаження обмежене конкретним набором типів, замаскований файл не відповідає дозволеному типу і відхиляється, тож такий сайт через цю проблему недосяжний. Друга: там, де поле “приймати будь-що” справді існує, не потрібен ні обліковий запис, ні пароль, ні сприяння будь-кого: форма відкрита для публіки за задумом.
Я описую це на тому рівні, який потрібен власникові сайту, щоб діяти, і не далі. Я не публікую подробиць, які дозволили б комусь відтворити проблему, і прошу вас не пробувати це ні на власному сайті, ні на чужому. Перевірка налаштувань вашої форми та номера версії, як описано нижче, дає все, що потрібно, щоб вирішити, що робити.
Якщо в моєму листі йшлося про цю проблему, це означає, що версія, про яку повідомляє ваш сайт, потрапляє в уражений діапазон. Я не перевіряв, чи можна експлуатувати саме ваш сайт, і не можу побачити, як налаштовані ваші форми. Усе, що я спостерігав, це версія.
Чи стосується це мене?
Це вирішують два питання, у такому порядку.
Перше: чи приймає якесь поле завантаження файли “будь-якого типу”?
Це вирішальне питання, і відповісти на нього можете лише ви. Перевірка власних форм абсолютно безпечна і є головною метою цієї сторінки.
- Увійдіть до консолі WordPress і відкрийте пункт Контакти (Contact Form 7) на бічній панелі.
- Відкрийте кожну форму, яка пропонує завантаження файлу, і знайдіть поле завантаження методом перетягування (поле цього плагіна, додане поряд зі стандартними тегами Contact Form 7).
- Перевірте, чи обмежує це поле типи файлів, які воно приймає.
- Якщо кожне поле завантаження обмежене конкретними типами (наприклад,
jpg,png,pdf), ця проблема не досягає вашого сайту, навіть на ураженій версії. Оновитися все одно варто в межах звичайного обслуговування. - Якщо хоч одне поле завантаження налаштоване на прийняття файлів будь-якого типу, проблема стосується вас, і вам слід оновитися якнайшвидше. Обмеження цього поля до типів, які вам справді потрібні, саме собою є розумним кроком, але виправленням є саме оновлення.
Будь ласка, не намагайтеся відтворити цю проблему ні на власному сайті, ні на чужому; для відповіді на питання вище цього не потрібно.
Друге: яка версія у вас працює?
Вам не обов’язково вірити мені на слово. Для цього плагіна є один конкретний спосіб перевірки, який введе вас в оману, тож цю частину варто прочитати уважно.
У панелі адміністрування WordPress (головне джерело):
- У консолі WordPress перейдіть до Плагіни, потім Встановлені плагіни.
- Знайдіть Drag and Drop Multiple File Upload - Contact Form 7, запис, тека якого називається
drag-and-drop-multiple-file-upload-contact-form-7, і подивіться версію, показану під назвою.
З публічного маніфесту (без входу): відкрийте в браузері
вашдомен.ua/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/readme.txt.
Рядок Stable tag: ближче до початку є версією, про яку повідомляє ваша інсталяція, і це одне з
публічних джерел, які я читав.
З вихідного коду сторінки (без входу): перегляньте вихідний код сторінки на своєму сайті й пошукайте один з клієнтських файлів плагіна за такими точними шляхами:
/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/assets/css/dnd-upload-cf7.css?ver=...
/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/assets/js/codedropz-uploader-min.js?ver=...
Число ?ver=, додане до цих файлів у цій теці, є власною версією плагіна. Для цього плагіна воно
точно відповідає випуску, тому я вважаю цю перевірку надійною.
Пастка, якої тут варто уникати. Окремий плагін цього ж автора для WooCommerce постачає файл із
такою самою назвою, codedropz-uploader-min.js, у своїй власній теці
(drag-and-drop-multiple-file-upload-for-woocommerce) з непов’язаним номером версії. Якщо ви
читаєте версію з вихідного коду сторінки, переконайтеся, що тека в шляху це
drag-and-drop-multiple-file-upload-contact-form-7, а не тека WooCommerce-плагіна; інакше ви
прочитаєте версію зовсім іншого продукту.
Далі застосуйте це правило, зважаючи на те, що версії порівнюються числово, а не за алфавітом:
- Від 1.3.9.3 до 1.3.9.8: потенційно уражена, залежно від відповіді на питання про поле завантаження вище. Оновіться зараз.
- 1.3.9.9 або новіша: уже виправлена щодо цієї проблеми. Найкращим кроком буде взяти найновішу доступну версію.
- Старіша за 1.3.9.3: не уражена цією проблемою. Описана вище вада з’явилася саме у версії 1.3.9.3. Утім, такий старий випуск сильно відстає в усьому іншому, і оновитися варто вже з загальних міркувань.
Якщо за наведеними вище перевірками не вдається отримати версію, яку можна прочитати, це не рідкість:
плагіни кешування чи оптимізації регулярно прибирають значення ?ver=, а ці файли з’являються лише
там, де плагін завантажується. Екран адміністрування з кроку один завжди дає відповідь.
Як оновитися
Найбезпечніший шлях: оновлюватися засобами самого WordPress, попередньо зробивши резервну копію.
- Зробіть резервну копію сайту (файлів і бази даних), перш ніж щось змінювати. Більшість хостинг-провайдерів пропонують резервне копіювання в один клік, або скористайтеся плагіном резервного копіювання для WordPress.
- У панелі адміністрування WordPress перейдіть до Консоль, потім Оновлення, або до Плагіни, потім Встановлені плагіни. Якщо оновлення цього плагіна є в переліку, встановіть його звідси.
- Якщо вам зручніше в командному рядку, WP-CLI робить те саме:
wp plugin update drag-and-drop-multiple-file-upload-contact-form-7(команда використовує назву теки). - Якщо оновлення не з’являється, ви можете взяти останній випуск безпосередньо зі сторінки плагіна в каталозі WordPress.org, Drag and Drop Multiple File Upload for Contact Form 7, і оновитися через Плагіни, потім Додати плагін, потім Завантажити плагін.
- Після оновлення підтвердіть новий номер версії (1.3.9.9 або новіша) за кроками вище й перевірте, що ваші форми та завантаження файлів досі працюють нормально.
Поки ви там, варто пересвідчитися, що ядро WordPress, Contact Form 7 та інші ваші плагіни оновлені, оскільки той самий принцип стосується їх усіх.
Після оновлення
Оновлення до 1.3.9.9 або новішої версії закриває проблему, і для більшості сайтів це весь обсяг завдання. Ця сторінка є запобіжним повідомленням, а не звітом про інцидент: я не маю жодної інформації про те, чи щось сталося на вашому сайті, і не дивився.
Варто розглянути один додатковий крок, і він залежить від того самого питання про поле завантаження. Якщо на вашому сайті була форма з полем завантаження “приймати файли будь-якого типу”, поки він працював на ураженій версії, тоді, принаймні теоретично, файл могли розмістити на вашому сервері. Оновлення закриває діру, але не прибирає нічого, що вже могло бути збережене, тож у такому разі варто вжити кількох звичайних запобіжних заходів:
- Перегляньте теку завантажень (зазвичай
wp-content/uploads/) на предмет файлів, яких ви не впізнаєте, особливо таких, що не є документами чи зображеннями того типу, який мають отримувати ваші форми. - Перевірте облікові записи адміністраторів, останні входи та будь-які активні сеанси на предмет чогось, що ви не можете пояснити.
- Скиньте паролі облікових записів адміністраторів. Розумним додатковим кроком буде також
перегенерувати секретні ключі та “солі” WordPress у
wp-config.php(нові значення доступні в один клік в офіційному генераторі секретних ключів, і їх заміна одноразово завершує сеанси всіх користувачів).
Якщо ви знайдете щось, що вас турбує, правильною відповіддю буде поводитися з цим так само, як і з будь-яким іншим підозрюваним несанкціонованим доступом. Якщо жодна з ваших форм не мала поля завантаження “приймати файли будь-якого типу”, достатньо самого оновлення.
Що я робив і чого не робив
Щоб бути цілком прозорим щодо перевірки, на якій ґрунтується мій лист: я читав лише файли, які ваш
сайт і так віддає кожному відвідувачеві, а саме публічний файл readme.txt плагіна, вашу головну
сторінку та адреси файлів, записані на цій сторінці. Я не звертався ні до панелі адміністрування
WordPress, ні до бази даних, ні до будь-якої закритої частини сайту.
Зокрема, я ніколи не надсилав жодної з ваших форм, ніколи не завантажував файл і ніколи не торкався обробника завантажень плагіна. Нічого не було надіслано, протестовано чи проексплуатовано. Тут це важить більше, ніж на більшості таких сторінок, бо завантаження файлу є саме тією дією, якої стосується ця проблема, тож “я цього не торкався” і є всією різницею між розкриттям і вторгненням.
Я також свідомо не публікую подробиць, які допомогли б комусь скористатися цією проблемою. Опис вище зупиняється на рівні, потрібному власникові сайту, і я не даю посилань на код підтвердження концепції.
Це спостереження за версією: ваш сайт повідомляє версію з ураженого діапазону. Це не твердження про те, що ваш сайт можна було експлуатувати на момент моєї перевірки. Оскільки проблема залежить від налаштування форми, якого я не бачу, сайт із цього діапазону цілком може бути невразливим, а сайт із цього діапазону може окремо бути захищений іншими засобами, наприклад брандмауером вебзастосунків.
У мене немає вебмайстра / я не даю ради
Якщо сайтом опікуєтеся не ви, перешліть, будь ласка, цю сторінку тому, хто ним опікується (вашому розробнику, агенції або хостинг-провайдеру). Кроки вище він упізнає одразу.
Якщо ви ведете сайт самі й застрягли, я радо підкажу напрямок безкоштовно. Напишіть за контактами нижче.
Контакти
Evan Harris, дослідник безпеки
- Ел. пошта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я звертаюся з такими питаннями винятково для того, щоб допомогти операторам захистити свої сайти. Якщо ви волієте більше не отримувати від мене листів, просто скажіть, і я це врахую.
Джерела
Офіційні бюлетені та відстеження
Розробник / плагін