Directory Traversal - представляет собой критическую уязвимость веб-приложений, которая позволяет злоумышленнику выходить за пределы предназначенного корневого каталога веб-сервера и получать доступ к произвольным файлам и директориям в файловой системе. Суть уязвимости заключается в некорректной обработке пользовательского ввода, используемого для построения путей к файлам. Когда приложение без должной проверки принимает такие параметры, как имена файлов из URL, данных форм или cookie, атаковавший может манипулировать этими параметрами, чтобы прочитать, а в некоторых случаях и записать, файлы за пределами целевой директории.
Механизм эксплуатации основан на использовании последовательностей смены родительского каталога, характерных для операционных систем. В Unix-подобных системах это последовательность «../», а в Windows - «..\». Для обхода примитивных фильтров злоумышленники активно применяют кодирование символов, например, используя URL-кодировку («%2e%2e%2f»), двойное URL-кодирование или Unicode-варианты («%c0%af»). Кроме того, могут использоваться абсолютные пути (например: «/etc/passwd») или варианты с обходом конкретных поддиректорий, если известна структура каталогов на сервере.
Практический пример атаки выглядит следующим образом. Предположим, существует веб-приложение, которое загружает файлы для пользователей через параметр запроса, например: https://example.com/view?document=quarterly_report.pdf. Злоумышленник может модифицировать запрос, изменив параметр на document=../../../etc/passwd. Если приложение не проводит корректную нормализацию и проверку этого пути, оно может интерпретировать последовательность «../» как команду подняться на три уровня выше в файловой иерархии и затем обратиться к системному файлу /etc/passwd, содержимое которого будет передано в ответе атакующему.
Последствия успешной атаки Directory Traversal являются крайне серьезными. Наиболее частое воздействие - это конфиденциальности данных, когда происходит утечка критически важной информации: файлов с паролями операционной системы, конфигурационных файлов веб-сервера и приложения, исходного кода, логов, содержащих служебные данные, и файлов сертификатов. В более опасных сценариях, если приложение обладает правами на запись, уязвимость может привести к модификации или созданию файлов, что открывает путь к дефейсу сайта, подмене легитимных страниц или даже установке веб-шелла для удаленного выполнения произвольных команд на сервере.
Основной причиной возникновения этой уязвимости является полное отсутствие или недостаточность валидации пользовательского ввода, который напрямую или с минимальной обработкой используется в системных вызовах для работы с файловой системой. Часто разработчики ошибочно полагаются на черные списки или простую фильтрацию только стандартной последовательности «../», не учитывая все многообразие методов обхода. Другим распространенной ошибкой является предположение, что пользователь будет взаимодействовать только с файлами из заранее заданного безопасного каталога, без условий реализации, которые явно и строго соблюдаются.
Защита от уязвимостей типа Directory Traversal требует реализации многоуровневого подхода. Наиболее надежной стратегией является полный отказ от использования пользовательского ввода в построении путей к файлам. Если это невозможно, необходимо применять строгую валидацию по белому списку допустимых символов и имен файлов. Ключевым этапом является каноникализация пути с последующей проверкой, что итоговый абсолютный путь начинается с разрешенной корневой директории. На уровне архитектуры рекомендуется хранить все файлы, доступные для загрузки, за пределами публичной корневой папки веб-сервера и обслуживать их через безопасный контроллер, который проверяет права доступа. Дополнительной и обязательной мерой является запуск веб-сервиса под учетной записью с минимально необходимыми привилегиями, что ограничивает потенциальный ущерб даже в случае успешной эксплуатации уязвимости.