Як запобігти вразливості завантаження файлів

  1. Вплив уразливості завантаження файлів
  2. Типи вразливості файлів
  3. Уразливість до локального завантаження файлів
  4. Уразливість віддаленого завантаження файлів
  5. Висновок

Уразливість до завантаження файлів є третім найпоширенішим типом уразливості, який ми виявили в нашому аналізі вразливостей вразливостей 1599 WordPress за 14 місяців.

Уразливість до завантаження файлів є третім найпоширенішим типом уразливості, який ми виявили в нашому аналізі вразливостей вразливостей 1599 WordPress за 14 місяців

Вплив уразливості завантаження файлів

У демонстрації відео нижче ми покажемо, як зловмисник виявляє уразливість завантаження файлу на вразливому веб-сайті. Зловмисник потім використовує Metasploit, щоб отримати віддалену оболонку на веб-сайті. Ми показуємо можливості, які віддалена оболонка надає зловмиснику. Відео ясно демонструє, що уразливості завантаження файлів надзвичайно серйозні та дуже легкі для використання.

Типи вразливості файлів

Існує два основних види уразливостей завантаження файлів. Ми збираємося надати ці описові імена в цій статті, які ви, можливо, не чули в іншому місці, але ми вважаємо, що вони описують різницю між основними типами уразливості завантаження.

Уразливість для завантаження локальних файлів є вразливістю, коли додаток дозволяє користувачеві безпосередньо завантажувати шкідливий файл, який потім виконується.

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

Давайте розглянемо кожну з цих вразливостей в деяких деталях, як вони створені і як їх уникнути.

Уразливість до локального завантаження файлів

Щоб вивчити цю вразливість, давайте подивимося на "wpshop" плагін завантаження уразливості Ось код, який створив цю вразливість:

$ file = $ _FILES ['wpshop_file']; $ tmp_name = $ file ['tmp_name']; $ name = $ file ["name"]; @move_uploaded_file ($ tmp_name, WPSHOP_UPLOAD_DIR. $ name);

Ти можеш знайдіть цей код у рядку 620 статей вкл. / ajax.php у версії 1.3.9.5 плагіна .

Код вище дає дві критичні помилки, які створюють уразливість завантаження файлу.

Помилка 1: Немає перевірки автентичності чи авторизації, щоб переконатися, що користувач увійшов (аутентифікація) і має доступ до виконання завантаження файлу (авторизації). Це дозволяє зловмисникам завантажувати файл на веб-сайт без необхідності входити або мати правильні дозволи.

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

if (! current_user_can ('upload_files')) // Переконайтеся, що поточний користувач може завантажувати файли wp_die (__ ('Ви не маєте дозволу на завантаження файлів.')); // Процес завантаження файлу

Помилка 2: Немає санітарної обробки назви файлу або вмісту. Це дозволяє зловмисникам завантажувати файл з розширенням .php, до якого зловмисник може отримати доступ з Інтернету та виконати його.

Розробники можуть уникнути цієї помилки, санізуючи ім'я файлу так, щоб він не містив розширення, яке може виконувати код через веб-сервер. WordPress має деякі вбудовані функції для перевірки та дезінфекції файлів перед завантаженням.

wp_check_filetype () перевірить, що розширення файлу дозволяється завантажувати, і, за замовчуванням, список допустимих завантажень файлів WordPress запобігає завантаженню виконуваного коду.

$ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name']))); if (! empty ($ fileInfo ['ext'])) {// Цей файл є дійсним} else {// Неправильний файл}

Можна також додатково обмежити, що дозволено, вказавши типи MIME, дозволені. Цей список дозволяє використовувати лише зображення.

// Ми дозволяємо тільки зображення $ allowedMimes = array ('jpg | jpeg | jpe' => 'image / jpeg', 'gif' => 'image / gif', 'png' => 'image / png',) ; $ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name']), $ allowedMimes);

Тепер, коли ми підтвердили, що ім'я файлу безпечне, ми будемо обробляти сам файл завантаження. WordPress має зручну вбудовану функцію: wp_handle_upload ().

$ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name']))); if (! empty ($ fileInfo ['type']))) {$ uploadInfo = wp_handle_upload ($ _ FILES ['wpshop_file'], масив ('test_form' => false, 'mimes' => $ allowedMimes,)); }

wp_handle_upload () приймає посилання на окремий елемент супер-глобального $ _FILES і повертає масив, що містить URL, повний шлях і тип MIME завантаження.

Перевірте вміст завантаження для додаткової безпеки

Отримуючи завантаження, ви можете уникнути того, що зловмисники завантажують виконуваний PHP чи інший код, вивчаючи ваші завантаження для вмісту. Наприклад, якщо ви приймаєте завантаження зображень, зателефонуйте PHP getimagesize () функція на завантаженому файлі, щоб визначити, чи є це правильним зображенням.

getimagesize () намагається прочитати інформацію заголовка зображення і не зможе виконати неправильне зображення. Це ще один метод перевірки вмісту, який ви очікуєте від користувача.

if (! @getimagesize ($ _ FILES ['wpshop_file'] ['tmp_name'])) wp_die (__ ('Недійсне зображення було надано.'));

Уразливість віддаленого завантаження файлів

Уразливість віддаленого завантаження файлів - це коли програма не приймає завантаження безпосередньо від відвідувачів сайту. Натомість відвідувач може надати в Інтернеті URL-адресу, яку буде використано програмою для отримання файлу. Цей файл буде збережено на диску у загальнодоступному каталозі. Після цього зловмисник може отримати доступ до цього файлу, виконати його та отримати доступ до сайту.

Уразливість TimThumb, яка торкнулася дуже великої кількості плагінів і тем, була віддаленою вразливістю для завантаження файлів. У випадку з TimThumb, бібліотека зображень надала розробникам можливість вказувати URL-адресу зображення в рядку запиту, щоб TimThumb.php витягував зображення з Інтернету.

Можна маніпулювати URL-адресою зображення, щоб зловмисник міг вказати файл PHP, який розміщувався на власному веб-сайті зловмисників. Після цього TimThumb отримає цей файл PHP і зберігає його на веб-сайті жертви в каталозі, доступному з Інтернету. Після цього зловмисник просто отримає доступ до цього файлу PHP у своєму браузері і зможе його виконати.

Як уникнути уразливості до віддалених файлів

Уникнення такої уразливості подібне до уникнення уразливості для завантаження файлів у локальних мережах:

  • Дозволити лише розширення файлів.
  • Дозволяти авторизованим та автентифікованим користувачам використовувати цю функцію.
  • Перевірте будь-який файл, отриманий з Інтернету, для вмісту. Переконайтеся, що це насправді зображення або будь-який інший тип файлу.
  • Подавайте завантажені файли з програми, а не безпосередньо через веб-сервер.
  • Зберігайте файли в каталозі, що не є загальнодоступним, якщо це можливо.
  • Записуйте у файл, коли ви зберігаєте його для включення заголовка, який робить його невиконаним.

Висновок

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