Манипуляция путями — уязвимость, при которой злоумышленник подставляет в путь к файлу специальные конструкции, чтобы получить доступ к другим файлам за пределами разрешенной папки.
В статье рассказываем, как возникает уязвимость, разбираем ошибки в коде, которые к ней приводят, и показываем, как правильно обрабатывать пути в PHP, Python и Java, чтобы защитить файловую систему.
Он использует такую уязвимость, чтобы читать конфиденциальные файлы, изменять их или запускать вредоносный код.

Что такое манипуляция путями и как защитить файловую систему

28 апреля 2025
10 минут
эксперт в информационной безопасности в Start X
Андрей Жаркевич
автор, дипломированный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
автор, дипломиро­ванный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
эксперт в информационной безопасности в Start X
Андрей Жаркевич

Что такое манипуляция путями и почему она опасна

Чтобы построить путь к файлу и открыть его, приложение добавляет имя файла к заранее определенной базовой директории.

Представьте, что все файлы лежат в папке /files/reports/. Когда пользователь вводит имя файла, например, report. pdf, приложение добавляет его к этому пути: /files/reports/report.pdf.

Если указать только имя файла, путь безопасен. Но если злоумышленник подставит, например:
../../../etc/passwd
Приложение сформирует путь:
/files/reports/../../../etc/passwd
Такой путь выходит за пределы папки reports и указывает на системную папку, в которой хранится файл «passwd». Это и есть манипуляция путями — уязвимость, которая позволяет добраться до чужих файлов и атаковать систему.
Скачайте карту знаний и навыков по безопасной разработке
В ней — 13 уязвимостей и технологий, которые нужно знать разработчику, чтобы писать безопасный код

Как злоумышленники обходят файловые ограничения

Для защиты от несанкционированного доступа разработчики устанавливают ограничения на имена и пути, но злоумышленники находят способы обойти эти ограничения.

Последовательности «./» и «./». ./ указывает на переход к родительской папке, а ./ — на текущую. Вместо обычного имени файла злоумышленник подставляет такие конструкции, чтобы выйти за пределы базовой папки. Например, ввод ./././etc/passwd приведет к тому, что приложение сформирует путь к системному файлу за пределами разрешенной области.

Абсолютные пути. Некоторые приложения принимают полный путь вместо имени файла. Злоумышленник может указать, например, /etc/passwd и получить доступ к системному файлу напрямую — в обход базовой папки.

Кодирование символов. Чтобы обойти фильтры, злоумышленники используют URL-кодирование и другие способы маскировки ввода. Например, последовательность ./ может быть записана как %2e%2e%2f. Это помогает обойти простые фильтры, которые настроены на обнаружение очевидных последовательностей.

null-байты. Иногда злоумышленники вставляют в путь специальный символ null — нулевой байт. Он заставляет функцию обработки строк воспринять путь не полностью и обрезать его. Это позволяет обойти проверку расширения файла и получить доступ к нежелательному ресурсу.

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

Телеграм-канал Start X

Подписаться
Наши разборы мошеннических схем поймет даже бабушка

Какие файлы и папки атакуют чаще всего

Злоумышленники выбирают для атаки файлы и папки, доступ к которым принесет им наибольшую выгоду.

Системные файлы. Например, «/etc/passwd» и «/etc/shadow» в Unix-системах, где хранится информация о пользователях, а также важные конфигурационные файлы. Доступ к ним позволяет собирать данные для дальнейших атак или изменять настройки системы, например, добавлять новых пользователей или изменять права доступа.

Конфигурационные файлы веб-приложений. Файлы вроде «config.php», «.env» или «web.config» содержат настройки подключения к базам данных, пароли и другие секреты. Взлом таких файлов может дать злоумышленнику доступ к критической информации и внутренним ресурсам.

Файлы логов. Журналы и логи часто содержат информацию об ошибках и действиях пользователей. Анализ таких данных помогает выявить уязвимости в системе или собрать сведения о внутренней структуре приложения.

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

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

Как понять, что система уязвима к атакам манипуляции путями

Самый простой способ обнаружить потенциальную уязвимость — проверить, как код обрабатывает пользовательский ввод при формировании путей к файлам. Если приложение напрямую объединяет данные от пользователя с базовой директорией, это сигнал о возможной проблеме.

Рассмотрим такой PHP-код:
<?php  
    $file = $_GET['file'];  
    include("/var/www/html/uploads/" . $file);  
  ?>
В этом примере данные из параметра URL напрямую добавляются к фиксированному пути. Если злоумышленник передаст строку «./././etc/passwd», система попытается включить системный файл, что может привести к утечке конфиденциальной информации.

Подобные проблемы возникают и в других языках. Вот пример уязвимого кода на Java:
File file = new File("/files/reports/" + userInput)
Если значение переменной userInput содержит последовательности «./», итоговый путь может выйти за пределы разрешенной директории.

То же самое касается Python-кода, где путь формируется с помощью конкатенации строк:
user_input = request.args.get('filename')
file_path = "/safe/path/" + user_input
Если данные не фильтруются или не нормализуются, злоумышленнику будет легко внедрить вредоносную последовательность.

Чтобы понять, уязвима ли система к атакам, нужно провести несколько тестов.

Можно попробовать вручную ввести вредоносные значения — например, «./././etc/passwd» или «././secret/data.txt» — и проанализировать, формируется ли итоговый путь, выходящий за рамки ожидаемой директории. Если при таком вводе обнаруживается обращение к файлам вне разрешенного диапазона, это сигнал о наличии уязвимости.

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

Как защитить файловую систему от атак манипуляциями путями

Ошибки в обработке путей к файлам делают систему уязвимой. Ниже — примеры кода с уязвимостями и рабочие способы защиты.
Фильтруйте входные данные
Представим, что в приложении на PHP пользовательский ввод используется для формирования пути к файлу:
<?php
  // Непроверенный ввод пользователя
  $filename = $_GET['file'];
  // Формирование пути без фильтрации
  $path = "/var/www/html/uploads/" . $filename;
  include($path);
?>
В этом примере злоумышленник может передать вредоносную строку, такую как «./././etc/passwd», что даст доступ к системным файлам. Чтобы предотвратить такую уязвимость, важно проверять ввод с помощью регулярных выражений и разрешать только безопасные символы:
<?php
  $filename = $_GET['file'];
  // Разрешаем только буквы, цифры, точки, тире и подчеркивания
  if (preg_match('/^[a-zA-Z0-9_\-\.]+$/', $filename)) {
      $path = "/var/www/html/uploads/" . $filename;
      include($path);
  } else {
      exit("Недопустимое имя файла");
  }
?>
Теперь ввод проверяется на соответствие определенным символам, что исключает возможность манипуляции путями.
Нормализуйте пути
Плохой подход — просто объединять базовую директорию с пользовательским вводом без проверки выхода за пределы разрешенной области.
Пример на Java:
File file = new File("/files/reports/" + userInput);
Если переменная userInput содержит «./», итоговый путь может выйти за пределы нужной папки. Лучшим решением будет использование методов нормализации пути.

Например:
Path basePath = Paths.get("/files/reports/").toRealPath();
Path filePath = basePath.resolve(userInput).normalize();
if (!filePath.startsWith(basePath)) {
throw new SecurityException("Попытка обхода директории!");
}
// Безопасно использовать filePath: он нормализован и находится внутри basePath
Этот подход гарантирует, что, даже если ввод содержит вредоносные элементы, итоговый путь останется в пределах разрешенной директории.
Используйте белые списки
Иногда лучше ограничить выбор пользователя заранее определенными значениями, чем позволять ему задавать имя файла самостоятельно.

Плохой пример на Python:
user_input = request.args.get('filename')
file_path = "/safe/path/" + user_input
Такой подход позволяет злоумышленнику вводить любые данные, в том числе опасные пути. Лучший вариант — использование белого списка:
ALLOWED_FILES = {"report.pdf", "summary.docx", "data.csv"}
user_input = request.args.get('filename')
if user_input in ALLOWED_FILES:
file_path = "/safe/path/" + user_input
else:
abort(400, "Недопустимое имя файла")
Белый список помогает исключить неожиданные значения — пользователь сможет выбрать только из заранее утвержденных файлов. Это снижает риск обхода и доступа к посторонним данным.
Настройте права доступа
Даже если код не содержит ошибок, важно ограничить права доступа приложения к файлам и каталогам на уровне операционной системы.
Приложение должно работать с минимально необходимыми правами — тогда даже при успешной атаке злоумышленник не сможет получить доступ к системным файлам. Это настройка не реализуется на уровне кода, но должна учитываться при конфигурации сервера.

Защита от атак манипуляции путями — не разовая настройка, а постоянный процесс развития и совершенствования безопасности приложения.

Проводите регулярные аудиты безопасности. Анализ кода и тестирование позволяют находить и устранять уязвимости до того, как ими воспользуются злоумышленники.

Автоматизируйте проверки. Системы статического анализа и сканеры уязвимостей помогут отслеживать проблемы уже на этапе разработки.

Обновляйте зависимости. Устаревшие библиотеки и компоненты — частая причина уязвимостей. Следите за актуальностью всех используемых инструментов.

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

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

Что еще почитать

Мужчина в кресле с ноутбуком

Подпишитесь на дайджест Start X

Еженедельная подборка материалов и аналитики про цифровые атаки на людей, технологии защиты, безопасность инфраструктуры и приложений
Нажимая кнопку «Отправить заявку» вы соглашаетесь с политикой обработки персональных данных.