# Path Traversal

В этом разделе мы узнаем, что такое Path Traversal и узнаем как проводить такие атаки и обходить типичные препятствия.

![directory-traversal.svg](https://2753068357-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7KQ4F0M3A1jSCGxOdZRW%2Fuploads%2Fgit-blob-4428385ac03410053c791ab4ca068da79ce390bf%2Fdirectory-traversal.svg?alt=media)

{% hint style="success" %}
**Лабораторные работы**

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

* [Просмотреть все лабораторные работы по обходу пути](https://portswigger.net/web-security/all-labs#path-traversal)
  {% endhint %}

## Что такое Path Traversal?

Path Traversal также известен как обход каталогов (directory traversal). Уязвимость позволяющая атакующему читать произвольные файлы на сервере, на котором работает приложение. Это может включать:

* Код и данные приложения.
* Учетные данные для внутренних систем.
* Конфиденциальные файлы операционной системы.

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

## Чтение произвольных файлов через Path Traversal

Представьте приложение-магазин, которое отображает изображения товаров. Оно может загружать изображение с помощью следующего HTML:

```html
<img src="/loadImage?filename=218.png">
```

URL `loadImage` принимает параметр `filename` и возвращает содержимое указанного файла. Файлы изображений хранятся на диске по пути `/var/www/images/`. Чтобы вернуть изображение, приложение добавляет запрошенное имя файла к этой базовой директории и использует API файловой системы для чтения содержимого файла. Другими словами, приложение читает из следующего пути:

```
/var/www/images/218.png
```

В этом приложении не реализовано никаких защит от атак обхода пути. В результате атакующий может запросить следующий URL, чтобы получить файл `/etc/passwd` из файловой системы сервера:

```
https://insecure-website.com/loadImage?filename=../../../etc/passwd
```

Это заставляет приложение читать из следующего пути:

```
/var/www/images/../../../etc/passwd
```

Последовательность `../` является допустимой в пути к файлу и означает подняться на один уровень в структуре каталогов. Три последовательности `../` поднимают нас от `/var/www/images/` к корню файловой системы, и фактически читается файл:

```
/etc/passwd
```

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

В Windows допустимы обе последовательности обхода каталогов `../` и `..\`. Ниже пример эквивалентной атаки против сервера на базе Windows:

```
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
```

{% hint style="success" %}
**LAB**

[**File path traversal, simple case**](https://portswigger.net/web-security/file-path-traversal/lab-simple)
{% endhint %}

## Распространённые препятствия при эксплуатации уязвимостей Path Traversal

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

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

Вы можете попробовать использовать абсолютный путь от корня файловой системы, например `filename=/etc/passwd`, чтобы напрямую сослаться на файл без использования каких-либо последовательностей обхода.

{% hint style="success" %}
**LAB**

[**File path traversal, traversal sequences blocked with absolute path bypass**](https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass)
{% endhint %}

Вы можете попробовать вложенные последовательности обхода, такие как `....//` или `....\/`. При вырезании внутренней последовательности они сводятся к обычным последовательностям обхода.

{% hint style="success" %}
**LAB**

[**File path traversal, traversal sequences stripped non-recursively**](https://portswigger.net/web-security/file-path-traversal/lab-sequences-stripped-non-recursively)
{% endhint %}

В некоторых контекстах, например в пути 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**. Он содержит некоторые закодированные последовательности обхода пути, которые можно попробовать.

{% hint style="success" %}
**LAB**

[**File path traversal, traversal sequences stripped with superfluous URL-decode**](https://portswigger.net/web-security/file-path-traversal/lab-superfluous-url-decode)
{% endhint %}

Приложение может требовать, чтобы переданное имя файла начиналось с ожидаемого базового каталога, например `/var/www/images`. В этом случае можно попытаться включить требуемый базовый каталог, а затем добавить соответствующие последовательности обхода. Например: `filename=/var/www/images/../../../etc/passwd`.

{% hint style="success" %}
**LAB**

[**File path traversal, validation of start of path**](https://portswigger.net/web-security/file-path-traversal/lab-validate-start-of-path)
{% endhint %}

Приложение может требовать, чтобы переданное имя файла заканчивалось ожидаемым расширением, например `.png`. В этом случае можно попытаться использовать нулевой байт, чтобы фактически завершить путь до требуемого расширения. Например: `filename=../../../etc/passwd%00.png`.

{% hint style="success" %}
**LAB**

[**File path traversal, validation of file extension with null byte bypass**](https://portswigger.net/web-security/file-path-traversal/lab-validate-file-extension-null-byte-bypass)
{% endhint %}

## Как предотвратить атаку Path Traversal

Наиболее эффективный способ предотвратить уязвимости Path Traversal — вовсе не передавать пользовательский ввод в API файловой системы. Многие функции приложения, которые делают это, можно переписать, чтобы обеспечить то же поведение более безопасным способом.

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

* Валидируйте пользовательский ввод перед обработкой. Идеально — сравнивать ввод с списком разрешённых значений (whitelist). Если это невозможно, убедитесь, что ввод содержит только разрешенный набор символов, например только буквенно-цифровые.
* После проверки переданного ввода добавьте его к базовому каталогу и используйте API файловой системы платформы, чтобы привести путь к канонической форме. Проверьте, что канонический путь начинается с ожидаемого базового каталога.

Ниже приведен пример простого кода на Java для проверки канонического пути к файлу на основе пользовательского ввода:

```java
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}
```

{% hint style="info" %}
**Подробнее**

* [Find directory traversal vulnerabilities using Burp Suite's web vulnerability scanner](https://portswigger.net/burp/vulnerability-scanner)
  {% endhint %}
