Перейти к содержимому

Поиск по платформе

File Upload: Webshell через загрузку в templates/

Загрузка документов сохраняет файлы в директорию templates/ без проверки содержимого. Просмотр файлов через render_template() позволяет выполнить Jinja2 SSTI.

Автор: Hack & Fix
Освоишь: magic-bytes проверкаrandom filenameвне docroot
Средне+60 XP ~32 мин python
CWE-434 · A04:2021 Pro
Обложка: File Upload: Webshell через загрузку в templates/ Обложка: File Upload: Webshell через загрузку в templates/
Задача
# Загрузка файлов: webshell через каталог шаблонов ## Сценарий Вы проводите аудит **FogByte** — интернет-магазина на Flask с внутренним разделом «Документы»: сотрудники загружают инструкции и накладные, затем открывают их в браузере. Раздел писал backend-разработчик Кирилл — он хранил файлы «там, куда фреймворк уже смотрит», а просмотр делал красиво: через тот же механизм, что рендерит страницы приложения. Новый технический директор, разбирая наследие, попросил внешний аудит всего, что работает с файлами. В реализации сошлись две ошибки. Загруженные файлы складываются внутрь каталога шаблонов фреймворка — той самой иерархии, откуда шаблонизатор берёт файлы для рендеринга. А страница просмотра не отдаёт файл байтами, а прогоняет его через шаблонизатор. Вместе это превращает «просмотр документа» в исполнение выражений шаблонизатора в серверном контексте — **SSTI**, из которого через цепочки атрибутов языка добираются до средств операционной системы. ## Цель 1. Авторизуйтесь как обычный пользователь, найдите раздел документов и подтвердите, что просмотр исполняет выражения шаблонизатора: простейший индикатор — арифметика в документе, которая возвращается вычисленной. 2. Соберите минимальный «webshell»: документ с выражением, которое через цепочку атрибутов добирается до средств работы с окружением процесса. 3. Загрузите документ, откройте его просмотр и прочитайте серверный секрет с флагом прямо из ответа. ## Теория Шаблонизатор исполняет файл как программу: встреченные выражения вычисляются на сервере при рендеринге. Для собственных страниц это норма; для пользовательских файлов — катастрофа. Из шаблонного контекста через стандартные цепочки атрибутов объектов языка доступны и встроенные механизмы, и средства операционной системы, включая чтение окружения процесса. Хранение загрузок внутри каталога шаблонов лишь облегчает задачу: загруженный файл сразу становится «легальным» шаблоном, и отдельный обход для него не нужен. **Уязвимый паттерн:** ```python filepath = os.path.join(UPLOAD_DIR, filename) file.save(filepath) return render_template(f'uploads/{name}', user=user) ``` Каталог загрузок находится внутри дерева шаблонов, а просмотр отдаёт пользовательский файл через шаблонизатор. ## Точка входа атаки `POST /documents/upload` — multipart-форма с полем файла `document` и CSRF-токеном страницы документов. Просмотр — `GET /documents/view/<имя_файла>`. **Пользователь:** `demo` / `demo`

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: File Upload: Path Traversal в имени файла Обложка лабы: File Upload: Path Traversal в имени файла
File Upload

File Upload: Path Traversal в имени файла

Загрузка аватара без санитизации имени файла позволяет перезаписать серверные шаблоны через path traversal в filename.

+60 XP
Python Pro
Exploit Fix
Обложка лабы: File Upload: обход проверки расширения через Content-Type Обложка лабы: File Upload: обход проверки расширения через Content-Type
File Upload

File Upload: обход проверки расширения через Content-Type

Загрузчик изображений проверяет расширение файла, но не его содержимое. HTML-файл, переименованный в .jpg, загружается и исполняется в браузере.

+30 XP
Python Pro
Exploit Fix
Обложка лабы: File Upload Bypass через подмену Content-Type Обложка лабы: File Upload Bypass через подмену Content-Type
File Upload

File Upload Bypass через подмену Content-Type

Обработчик загрузки файлов проверяет только расширение (.jpg, .png, .gif), но не реальное содержимое файла. HTML-файл с расширением .jpg будет принят и отдан браузеру.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: File Upload Bypass через двойное расширение Обложка лабы: File Upload Bypass через двойное расширение
File Upload

File Upload Bypass через двойное расширение

Обработчик загрузки использует filepath.Ext() для проверки расширения, но эта функция возвращает только последнее расширение. Файл test.html.jpg проходит проверку, а Go http.FileServer может определить Content-Type по первому расширению.

+60 XP
Go Pro
Exploit Fix