File Upload Attack Guide

File Upload Attack: експлуатуємо вразливості завантаження файлів

Сьогодні більшість веб-сайтів й додатків містять вбудований функціонал завантаження файлів різних розширень. Це дає змогу користувачам завантажувати свої файли на сайт, ділитись ними з іншими користувачами і так далі. Разом з цим виникає питання безпеки – фільтрації та перевірки завантажених даних на стороні сервера, що на практиці не завжди реалізовано належним чином. А відтак з’являється можливість маніпулювати та зловживати цим функціоналом завантажуючи різноманітні шкідливі файли, наприклад бекдори, шели, трояни. У цій публікації ми на практиці розберемо File Upload Attack – один з найрозповсюдженіших видів атак, а також дамо поради та рекомендації щодо захисту.

Що таке File Upload Attack? Опис та принцип дії.

File Upload Attack – це тип кібератаки, яка експлуатує вразливості завантаження файлів (Unrestricted File Upload та Unauthenticated Arbitrary File Upload) та зловживає відсутністю верифікації і валідації даних на стороні сервера, що призводить до несанкціонованого доступу та віддаленого виконання коду (Remote Code Execution, RCE), а також інших атак і вразливостей.

Вразливості завантаження файлів на сьогодні є одними з найпоширеніших вразливостей критичного рівня, виявлених у веб-додатках. Практично кожен третій сайт, за нашими підрахунками, вразливий до File Upload Attack.

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

Основною точкою компрометації виступають різноманітні форми завантаження, прикріплення, відправки файлів, наприклад:

  • Форма завантаження аватару (світлини користувача)
  • Форма завантаження зображень (JPG, PNG, GIF та інших)
  • Форма завантаження документів (PDF, DOC та інших)
  • Форма завантаження резюме CV
  • Форма створення тікету
  • Форма запису онлайн
  • Форма завантаження макетів
  • ….і т.д.

Найбільша небезпека проявляється саме тоді, коли такі форми є публічнодоступними й дозволяють прикріплювати та надсилати файли ДОВІЛЬНОГО ФОРМАТУ навіть НЕАВТОРИЗОВАНИМ користувачам!

Unresricted File Upload Form
Приклад вразливої форми завантаження файлів.

Знайти в інтернеті потенційно вразливі до File Upload Attack сайти можна з допомогою пошукових запитів Google Dorks:

  • site:*.ua intext:"прикріпити файл" OR "завантажити файл"
  • site:*.ua intext:обрати файл AND вкладення
  • site:*.ua intext:обрати файл AND Дозволені файлові розширення:
  • site:*.ua intext:Дозволені файлові розширення
  • site:*.ua intext:завантажити файл OR макет
  • site:*.ua intext:завантажити файл OR візитка OR макет

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

  1. Який використовується веб-сервер?
  2. Яка використовується версія PHP?
  3. Яка використовується CMS-система?
  4. Дослідження вихідного коду веб-сайту
  5. Дослідження структури каталогів
  6. Дослідження веб-форм і веб-елементів
  7. Пошук / виклик системних помилок
  8. Які формати файлів приймає сервер? (Fuzzing File Extensions)
  9. Які формати файлів відхиляє/блокує сервер?
  10. Які типи блокування при завантаженні файлів застосовуються? (Client-side, Server-side, Whitelist, Blacklist, Content-Type, MIME-type)
  11. В якій папці зберігаються завантажені файли?
  12. Чи очищаються метадані файлів?
  13. Чи змінює сервер назви файлів?
  14. Чи змінює сервер розмір і тип файлів?
ЧИТАЙТЕ ТАКОЖ:  У пошуках безпечного месенджера

Після цього хакер переходить до етапу експлуатації форми завантаження цільового сайту і з допомогою проксі Burp Suite перехоплює та аналізує POST-запити:

  1. Які HTTP-заголовки?
  2. Які поля і параметри передаються?
  3. Які Сontent-Type завантажених файлів?
  4. Що відбудеться, якщо підмінити розширення файлу?
  5. Що відбудеться, якщо підмінити Content-Type?
  6. Що відбудеться, якщо підмінити MIME-тип? (через magic bytes)
  7. Що відбудеться, якщо завантажити файл з назвою, яка вже існує?
  8. Що відбудеться, якщо завантажити файл з системною назвою?
  9. Що відбудеться, якщо завантажити файл із занадто довгою назвою?
  10. Що відбудетьься, якщо завантажити занадто великий файл?
Аналіз POST-запиту в BurpSuite
Аналіз перехопленого POST-запиту в BurpSuite при завантаженні файлу через форму. Як бачимо, через розширення .jpg файл сприйнявся сервером як зображення (Content-Type: image/jpeg), проте він містить виконуваний php-код і після завантаження його можна відкрити та запустити в дію.

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

Ось приклади найпростіших файлів з веб-оболонкою:

  • <?php file_get_contents('/etc/passwd'); ?> – читання файлів на сервері через get-функцію;
  • <?php system('hostname'); ?> – виконання системних команд на сервері з допомогою функції system;
  • <?php system($_REQUEST['cmd']); ?> – доступ до оболонки командного рядка Linux з допомогою функції system та параметра cmd (наприклад, http://example.com/uploads/shell.php?cmd=id);
  • <?php phpinfo();?> – вивід технічної інформації по PHP запитуваного сервера;
  • <% eval request('cmd') %> – оболонка командого рядка в ASP-файлі.

Більш складні програмні веб-шели:

Як обійти, зламати серверну логіку / перевірку?

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

  • Підміна розширення. Хакер завантажує файл дозволеного формату, просто переіменувавши шкідливий php-файл на shell.jpg, а потім перехоплює POST-запит і повертає розширення на shell.php. Таким чином замаскований файл завантажується на сервер і потім виконується. Це найпростіший спосіб, який спрацьовує лише за умови, якщо сервер перевіряє формат, але не перевіряє вміст файлу.
  • Подвійні розширення. Логіка деяких серверів перевіряє тільки розширення файлів (за regex-виразом) і якщо дозволені тільки зображення, то хакер може приховати php-файл за подвійним розширенням, наприклад shell.php.jpg або shell.jpg.php. У висновку, такий файл завантажиться і виконається як PHP (завдяки недостатній, застарілій, помилковій конфігурації веб-сервера).
  • Розширення зі зміненим регістром. Деякі сервери можуть відхиляти розширення з чорного списку, однак вони можуть не враховувати регістр. Якщо змінити його на мішаний (верхній+нижній), тоді файл завантажується і все одно може виконуватися як скрипт.
  • Розширення зі спецсимволами. Аналогічно можна зламати логіку деяких застарілих або неправильно налаштованих серверів з допомогою спецзнаків в розширенні: .php%20, .php%0a, .php/, php…… та інші.
  • Нестандартні розширення. Наприклад, php5, php6, php7, php8, phar, phtml. Можуть пропускатися деякими серверами і виконуватися як PHP.
  • Підміна Content-Type. Заголовок Content-Type відповідає за тим файлу, наприклад зображення, документ або виконуваний об’єкт. Хакер може через Burp Suite перехопити POST і підмінити значення Content-Type. Наприклад встановити значення image/jpeg для PHP-файлу. Або навпаки, для зображення, яке містить шкідливий код замість image/jpeg підставити application/x-php.
  • Виконання XSSi/SQLi/XXE/LFI/SSRF та інших вразливостей через файл. Наприклад, можна перейменувати файл на: <script>alert('XSS')</script> або '"><img src=x onerror=alert(document.domain)>.extension. При завантаження цей код виконається. Або ж застосувати Path Traversal Attack: .png../../../../../../../etc/passwd. OS Command Shell: file$(whoami).jpg. Можна також додати код в файл зображення командою: exiftool -Comment=' "><img src=1 onerror=alert(window.origin)>' shell.jpg. Можна додатково підмінити Content-Type на text/html. Інші приклади з XSS див. тут.
  • Додавання магічних байтів (magic bytes). Магічні байти – це код, який повідомляє серверу, що файл є зображенням (закріплює MIME-тип). Ним можна зловживати і додавати в файли різного формату, щоб сервер повірив, що це зображення:
    • магічні байти PNG: \x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03[
    • магічні байти JPG: \xff\xd8\xff
    • магічні байти GIF: GIF87a або GIF8;
    • магічні байти JPEG: FF D8 FF E0 (кодуватиметься як ÿØÿà);
      • echo -ne '\xFF\xD8\xFF\xE0' > jpeg_magic.bin – створення файл з нульовим байтом;
      • cat jpeg_magic.bin phpinfo.php > phpinfo.php.jpg – передача нульового байту та вмісту вказаного php-файлу у новий файл з подвійним розширенням.
      • file text.jpg – команда перевідки MIME-типу.
    • Магічні байти можна також додати у файл через HEX-редактор. Командою xxd file.png можна перевірити результат.
  • Зміна вихідного коду. Це актуально, якщо перевірка здійснюється на стороні клієнта (client-side). В такому випадку достатньо переглянути вихідний код і вилучити з форми (зазвичай тег <input>) певну ділянку коду, яка відповідає за білий список або чорний список файлів.
  • Інші атаки. Decompression Bomb (маніпуляції з архівами), Pixel Flood (маніпуляції з розміром зображення), DoS (наприклад, завантаження надто великого файлу і т.д.), AVI/FFMPEG, SWF Flash Vulnerabilitiers.
ЧИТАЙТЕ ТАКОЖ:  Форензика зображень: інструменти, техніки, методики
File Upload Attack bypass WAF
Приклад обходу блокування фільтрів на стороні сервера через подвійне розширення і підміну Content / MIME-типу.
MIME type spoofing
Приклад обходу блокування при завантажені шкідливого файлу-шела з подвійним розширенням та підміненим MIME-типом, який відповідає зображенню JPEG.
File Upload Attack via XXE
File Upload Attack через завантаження шкідливого SVG-файлу.
SVG file include via File Upload Attack
Доступ до системних локальних файлів через завантаження шкідливого SVG-файлу. Таким чином можна зчитати вміст багатьох файлів, наприклад upload.php, щоби зрозуміти логіку файлів завантаження.
SVG File Upload Attack example
Приклад атаки із завантаженням шкідливого SVG та зчитування вмісту локального файлу upload.php, зашифрованого в BASE64, який можна дешифрувати і розгадати логіку блокування завантаження файлів на сервері.
File Upload Attack mindmap
Mind-мапа File Upload Attack.
File Upload Attack Mindmap
Mind-мапа способів експлуатації File Upload Attack.

Як захиститись від File Upload Attack?

  • Валідація, санітизація, перевірка завантажених файлів на стороні сервера (Server-Side), а не  лише фронтенду (Client-Side);
  • Перевірка по білому (Whitelist) і чорному (Blacklist) списку розширень на основі регулярних виразів;
  • Перевірка по типу файлу (MIME) і контенту (Content-Type);
  • Перевірка не лише розширення, а й вмісту файлу (аналіз вихідного коду);
  • Обмеження розміру файлу;
  • Обмеження довжини назви файлу;
  • Обмежений доступ та ізоляція завантажених файлів (уникнення розкриття каталогу завантажень і прямого доступу до файлів);
  • Зберігати файли на окремому сервері;
  • Очищення мета-даних завантажених файлів;
  • Переіменування завантажених файлів (рандомізація імен);
  • Заборона на виконання завантажених файлів;
  • Формування чорних списків розширень;
  • Правильна конфігурація веб-сервера і PHP: open_basedir, .htaccess, allow_url_fopen, allow_url_include, exec, shell_exec, system, passthru та ін.;
  • Вимкнення показу серверних помилок;
  • Регулярне оновлення серверних компонентів, бібліотек, програмного забезпечення;
  • Регулярне сканування сервера на наявність шкідливих файлів;
  • Використання файєрвола – серверного (CSF, IPtables etc.) і на рівні веб-додатку (WAF).

Джерела та посилання

  1. SecLists. File web extensions.
  2. SecLists. Content-Types.
  3. PayloadAllTheThings. Upload Insecured Files.
  4. OWASP. File Upload Cheat Sheet.
  5. OWASP. Unrestricted File Upload.
  6. Вікіпедія. МІМЕ-тип.
  7. All known MIME types
  8. MIME Search
  9. Magic MIME list.
  10. Wikipedia. 8.3 Filename.
  11. Collection of Wordlists for Bug Bounty Hunters
  12. SANS. Web Application File Upload Vulnerabilities.
  13. Хашаев Артур. Уязвимости File Upload.
  14. Malicious File Upload Checklist

Автор: © Konrad Ravenstone, KR. Laboratories Research

Konrad Ravenstone// про автора

Кібермольфар, хакер, лінуксоїд, дослідник безпеки в KR. Labs Research

Сподобалася стаття? Поділитися в соцмережах:
KR. Labs Research
Рекомендоване:
Для будь-якого хакера, аналітика, осінтера важливо уміти швидко знаходити дані…