Path Traversal
В этом разделе мы узнаем, что такое Path Traversal и узнаем как проводить такие атаки и обходить типичные препятствия.
Лабораторные работы
Если вы знакомы с базовыми концепциями обхода пути и хотите попрактиковаться в их эксплуатации на реалистичных, преднамеренно уязвимых целях, вы можете перейти к лабораторным работам по ссылке ниже.
Что такое Path Traversal?
Path Traversal также известен как обход каталогов (directory traversal). Уязвимость позволяющая атакующему читать произвольные файлы на сервере, на котором работает приложение. Это может включать:
Код и данные приложения.
Учетные данные для внутренних систем.
Конфиденциальные файлы операционной системы.
В некоторых случаях атакующий может иметь возможность записывать произвольные файлы на сервер, что позволяет ему изменять данные или поведение приложения и в итоге получить полный контроль над сервером.
Чтение произвольных файлов через Path Traversal
Представьте приложение-магазин, которое отображает изображения товаров. Оно может загружать изображение с помощью следующего HTML:
URL loadImage принимает параметр filename и возвращает содержимое указанного файла. Файлы изображений хранятся на диске по пути /var/www/images/. Чтобы вернуть изображение, приложение добавляет запрошенное имя файла к этой базовой директории и использует API файловой системы для чтения содержимого файла. Другими словами, приложение читает из следующего пути:
В этом приложении не реализовано никаких защит от атак обхода пути. В результате атакующий может запросить следующий URL, чтобы получить файл /etc/passwd из файловой системы сервера:
Это заставляет приложение читать из следующего пути:
Последовательность ../ является допустимой в пути к файлу и означает подняться на один уровень в структуре каталогов. Три последовательности ../ поднимают нас от /var/www/images/ к корню файловой системы, и фактически читается файл:
В Unix-подобных операционных системах это стандартный файл, содержащий сведения о пользователях, зарегистрированных на сервере, однако атакующий может получить и другие произвольные файлы, используя тот же прием.
В Windows допустимы обе последовательности обхода каталогов ../ и ..\. Ниже пример эквивалентной атаки против сервера на базе Windows:
Распространённые препятствия при эксплуатации уязвимостей Path Traversal
Во многих приложениях, которые подставляют пользовательский ввод в пути файлов, реализованы защиты от атак Path Traversal. Их нередко можно обойти.
Если приложение вырезает или блокирует последовательности обхода каталогов из переданного имени файла, возможно обойти защиту различными способами.
Вы можете попробовать использовать абсолютный путь от корня файловой системы, например filename=/etc/passwd, чтобы напрямую сослаться на файл без использования каких-либо последовательностей обхода.
Вы можете попробовать вложенные последовательности обхода, такие как ....// или ....\/. При вырезании внутренней последовательности они сводятся к обычным последовательностям обхода.
В некоторых контекстах, например в пути URL или параметре filename запроса multipart/form-data, веб-серверы могут вырезать любые последовательности обхода каталогов до передачи ввода в приложение. Иногда можно обойти такую очистку, закодировав в URL, или даже дважды закодировав в URL, символы ../. Это даст %2e%2e%2f и %252e%252e%252f соответственно. Также могут сработать различные нестандартные кодировки, такие как ..%c0%af или ..%ef%bc%8f.
Для пользователей Burp Suite Professional в Burp Intruder предусмотрен предопределенный список полезных данных Fuzzing - path traversal. Он содержит некоторые закодированные последовательности обхода пути, которые можно попробовать.
Приложение может требовать, чтобы переданное имя файла начиналось с ожидаемого базового каталога, например /var/www/images. В этом случае можно попытаться включить требуемый базовый каталог, а затем добавить соответствующие последовательности обхода. Например: filename=/var/www/images/../../../etc/passwd.
Приложение может требовать, чтобы переданное имя файла заканчивалось ожидаемым расширением, например .png. В этом случае можно попытаться использовать нулевой байт, чтобы фактически завершить путь до требуемого расширения. Например: filename=../../../etc/passwd%00.png.
Как предотвратить атаку Path Traversal
Наиболее эффективный способ предотвратить уязвимости Path Traversal — вовсе не передавать пользовательский ввод в API файловой системы. Многие функции приложения, которые делают это, можно переписать, чтобы обеспечить то же поведение более безопасным способом.
Если вы не можете избежать передачи пользовательского ввода в API файловой системы, мы рекомендуем использовать два уровня защиты для предотвращения атак:
Валидируйте пользовательский ввод перед обработкой. Идеально — сравнивать ввод с списком разрешённых значений (whitelist). Если это невозможно, убедитесь, что ввод содержит только разрешенный набор символов, например только буквенно-цифровые.
После проверки переданного ввода добавьте его к базовому каталогу и используйте API файловой системы платформы, чтобы привести путь к канонической форме. Проверьте, что канонический путь начинается с ожидаемого базового каталога.
Ниже приведен пример простого кода на Java для проверки канонического пути к файлу на основе пользовательского ввода:
Last updated