атака обхода пути — уязвимость загрузки файлов

Обход пути при загрузке файлов: как разработчики создают собственные эксплойты

Когда загрузка файлов превращается в доступ к файлам

Один небезопасный обработчик загрузки может открыть путь для атаки с полным обходом пути и уязвимости загрузки файлов. Когда разработчики объединяют имена файлов напрямую с путями загрузки, злоумышленники могут отправлять вредоносные имена файлов , такие как ../../etc/passwd для выхода из каталогов и доступа к конфиденциальным файлам. Такой тип обхода пути превращает простой API загрузки в мощный способ доступа к файлам, особенно когда приложение работает с повышенными разрешениями.

⚠️Небезопасный пример, только для образовательных целей. Не использовать в продакшене.

// Vulnerable upload handler, file upload vulnerability [HttpPost("/upload")] public async Task<IActionResult> Upload(IFormFile file) {     var path = Path.Combine("uploads/", file.FileName);  // No validation     using var stream = new FileStream(path, FileMode.Create);     await file.CopyToAsync(stream);     return Ok("File uploaded!"); } 

Злоумышленник может загрузить файл с именем ../../web.config для перезаписи или чтения запрещенных файлов — классическая атака обхода пути.

Защищенная версия:

// Safe upload with validation and canonicalization [HttpPost("/upload")] public async Task<IActionResult> Upload(IFormFile file) {     var fileName = Path.GetFileName(file.FileName); // strip directories     var targetDir = Path.GetFullPath("uploads/");     var safePath = Path.Combine(targetDir, fileName);       if (!safePath.StartsWith(targetDir))         return BadRequest("Invalid file path");       using var stream = new FileStream(safePath, FileMode.Create);     await file.CopyToAsync(stream);     return Ok("File securely uploaded!"); } 

Образовательная заметка: Всегда канонизируйте пути с помощью Path.GetFullPath() и убедитесь, что результат находится в каталоге загрузки. Никогда не доверяйте file.ИмяФайла Его можно использовать без дополнительной настройки.

Ошибки разработчиков, которые позволяют обходить путь

Большинство уязвимостей загрузки файлов, приводящих к обходу пути, возникают из-за спешки с кодом и отсутствия проверки. Распространенные ошибки разработчиков включают:

  • Объединение пользовательского ввода непосредственно в пути файловой системы
  • Доверяя Content-Type или только проверка расширения
  • Пропуск нормализации путей перед сохранением

Повторное использование временных папок в запросах или микросервисах

⚠️Небезопасный пример, только для образовательных целей. Не использовать в продакшене.

# Flask example vulnerable to path traversal attack @app.route('/upload', methods=['POST']) def upload():     file = request.files['file']     file.save('uploads/' + file.filename)     return 'Uploaded' 

Злоумышленники могут обойти эту простую конкатенацию для обхода каталогов (../../app.py) и записывать или перезаписывать произвольные файлы. Защищенная версия:

# Safe file upload validation from werkzeug.utils import secure_filename @app.route('/upload', methods=['POST']) def upload():     file = request.files['file']     name = secure_filename(file.filename)     path = os.path.join('uploads', name)     file.save(path)     return 'Securely uploaded' 

Образовательная заметка: Используйте помощников, предоставляемых фреймворком, таких как защищенное_имя_файла и обеспечить использование расширений из списка разрешенных. Никогда не объединяйте входные данные в пути к файлам вручную.

Эксплуатация в реальности Pipelines и микросервисы

Атаки с обходом пути происходят не только в публичных конечных точках. Они часто происходят внутри CI/CD системы, хранилища артефактов или микросервисы, управляющие загруженными файлами. Например, уязвимость загрузки файлов в менеджере артефактов сборки может позволить злоумышленнику перезаписать скрипты сборки или внедрять вредоносные файлы в общие среды выполнения.

⚠️Небезопасный пример, только для образовательных целей. Не использовать в продакшене.

# Never expose real tokens, credentials, or internal URLs in pipelines - name: Store build artifact   run: cp $UPLOAD_PATH/$FILENAME /var/artifacts/$FILENAME 

If $ FILENAME не проверен, созданный ../../../etc/passwd значение может перезаписать критические системные файлы во время развертывания, что является реальной атакой обхода пути. Защищенная версия: 

# Safer artifact storage guardrail - name: Store build artifact securely   run: |     SAFE_NAME=$(basename "$FILENAME")     cp "$UPLOAD_PATH/$SAFE_NAME" /var/artifacts/"$SAFE_NAME" 

Образовательная заметка: In pipelines, очистите все динамические переменные пути. Ограничьте операции записи контролируемыми каталогами, чтобы предотвратить выход файловой системы из строя во время сборки или развертывания.

Предотвращение обхода пути в логике загрузки

Предотвращение обхода пути начинается со строгой проверки и изоляции входных данных. С самого начала относитесь к именам файлов и путям как к ненадёжным входным данным, особенно при работе с загруженными файлами.

Лучшие практики

  1. Нормализовать и канонизировать все пути перед их использованием.
  2. Ограничить загрузки в выделенный каталог за пределами корневого каталога веб-сайта.
  3. Обеспечить соблюдение белых списков для расширений файлов и типов MIME.
  4. Никогда не используйте временные папки повторно между сеансами или пользователями.
  5. Используйте контейнерное хранение для загруженных файлов, когда это возможно.

Мини-профилактический контрольный список

  • Проверьте каждое имя файла с помощью Path.GetFileName() или эквивалент.
  • Разрешите полные пути и проверьте границы каталогов.
  • Примените списки разрешенных расширений и MIME.
  • Используйте отдельные папки для загрузки для каждого пользователя или сеанса.
  • Включить сканирование и проверку загрузки в CI/CD тесты.

Образовательная заметка: Каждый обработчик загрузки файлов представляет собой потенциальный вектор атаки с обходом пути. Создайте эшелонированную защиту, проверяя, изолируя и сканируя весь код обработки файлов.

Как Xygeni обнаруживает и блокирует небезопасные потоки загрузки

Ксигени Code Security сканирует кодовые базы и pipelineдля обнаружения шаблонов обхода пути до того, как они попадут в производство. Он отмечает небезопасную конкатенацию путей, отсутствие канонизации и опасные файловые операции как в коде, так и в CI/CD скриптов.

Функциональный фрагмент с ограждением управления:

# Secure enforcement with Xygeni - name: Enforce secure upload and path handling   run: dotnet xygeni enforce --rules uploads,path,security --fail-on-risk 

Образовательная заметка: Интегрируя Ксигени в свой pipeline обеспечивает автоматическое выявление уязвимостей загрузки файлов и атак обхода пути во время проверки сборки.

Закрытие разрыва: предотвращение следующей атаки с обходом пути

Ошибка обхода одного пути в конечной точке загрузки файла может предоставить злоумышленникам доступ к файловой системе вашего сервера. Проверьте обработчики загрузки на предмет небезопасных конкатенаций, нормализуйте все пути и никогда не доверяйте именам файлов, контролируемым пользователем. Добавить инструменты сканирования уязвимостей , такие как Xygeni Code Security . DevSecOps pipeline для обнаружения атак обхода пути и уязвимостей загрузки файлов до их отправки. С точки зрения безопасности каждый сохраненный файл должен рассматриваться как исполняемый код!

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
Получите бесплатный аккаунт.
Нет необходимости кредитную карту.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni