Сьогодні більшість веб-сайтів й додатків містять вбудований функціонал завантаження файлів різних розширень. Це дає змогу користувачам завантажувати свої файли на сайт, ділитись ними з іншими користувачами і так далі. Разом з цим виникає питання безпеки – фільтрації та перевірки завантажених даних на стороні сервера, що на практиці не завжди реалізовано належним чином. А відтак з’являється можливість маніпулювати та зловживати цим функціоналом завантажуючи різноманітні шкідливі файли, наприклад бекдори, шели, трояни. У цій публікації ми на практиці розберемо 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
- Форма створення тікету
- Форма запису онлайн
- Форма завантаження макетів
- ….і т.д.
Найбільша небезпека проявляється саме тоді, коли такі форми є публічнодоступними й дозволяють прикріплювати та надсилати файли ДОВІЛЬНОГО ФОРМАТУ навіть НЕАВТОРИЗОВАНИМ користувачам!

Знайти в інтернеті потенційно вразливі до 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 макет
Перед проведенням атаки, хакер проводить мережеву розвідку, вивчає технології, дерево каталогів, компоненти досліджуваного ресурсу. Спочатку завантажує легітимні файли, щоб розібратись як працює механізм обробки. Він повинен дати відповідь на наступні питання:
- Який використовується веб-сервер?
- Яка використовується версія PHP?
- Яка використовується CMS-система?
- Дослідження вихідного коду веб-сайту
- Дослідження структури каталогів
- Дослідження веб-форм і веб-елементів
- Пошук / виклик системних помилок
- Які формати файлів приймає сервер? (Fuzzing File Extensions)
- Які формати файлів відхиляє/блокує сервер?
- Які типи блокування при завантаженні файлів застосовуються? (Client-side, Server-side, Whitelist, Blacklist, Content-Type, MIME-type)
- В якій папці зберігаються завантажені файли?
- Чи очищаються метадані файлів?
- Чи змінює сервер назви файлів?
- Чи змінює сервер розмір і тип файлів?
Після цього хакер переходить до етапу експлуатації форми завантаження цільового сайту і з допомогою проксі Burp Suite перехоплює та аналізує POST-запити:
- Які HTTP-заголовки?
- Які поля і параметри передаються?
- Які Сontent-Type завантажених файлів?
- Що відбудеться, якщо підмінити розширення файлу?
- Що відбудеться, якщо підмінити Content-Type?
- Що відбудеться, якщо підмінити MIME-тип? (через magic bytes)
- Що відбудеться, якщо завантажити файл з назвою, яка вже існує?
- Що відбудеться, якщо завантажити файл з системною назвою?
- Що відбудеться, якщо завантажити файл із занадто довгою назвою?
- Що відбудетьься, якщо завантажити занадто великий файл?

Після успішного завантаження хакеру залишається знайти і відкрити шкідливий файл, щоб він виконався. Це може бути реверс-шелл або веб-шелл (веб-оболонка).
Ось приклади найпростіших файлів з веб-оболонкою:
<?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можна перевірити результат.
- магічні байти PNG:
- Зміна вихідного коду. Це актуально, якщо перевірка здійснюється на стороні клієнта (client-side). В такому випадку достатньо переглянути вихідний код і вилучити з форми (зазвичай тег <input>) певну ділянку коду, яка відповідає за білий список або чорний список файлів.
- Інші атаки. Decompression Bomb (маніпуляції з архівами), Pixel Flood (маніпуляції з розміром зображення), DoS (наприклад, завантаження надто великого файлу і т.д.), AVI/FFMPEG, SWF Flash Vulnerabilitiers.







Як захиститись від 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).
Джерела та посилання
- SecLists. File web extensions.
- SecLists. Content-Types.
- PayloadAllTheThings. Upload Insecured Files.
- OWASP. File Upload Cheat Sheet.
- OWASP. Unrestricted File Upload.
- Вікіпедія. МІМЕ-тип.
- All known MIME types
- MIME Search
- Magic MIME list.
- Wikipedia. 8.3 Filename.
- Collection of Wordlists for Bug Bounty Hunters
- SANS. Web Application File Upload Vulnerabilities.
- Хашаев Артур. Уязвимости File Upload.
- Malicious File Upload Checklist
Автор: © Konrad Ravenstone, KR. Laboratories Research

