Path traversal, або обхід шляху каталогу, є вразливістю безпеки веб-додатків, яка дозволяє зловмисникам отримувати несанкціонований доступ до файлів і каталогів, розташованих поза межами кореневої папки веб-сервера. Шляхом маніпулювання змінними, що вказують на файли, зловмисники використовують послідовності повернення на попередній рівень типу крапка-крапка-коса риска або абсолютні шляхи для читання конфіденційних даних, таких як вихідний код додатків, конфігураційні файли або критичні системні файли.

Механізм атаки базується на тому, як операційна система обробляє імена файлів, передані їй веб-додатком. Проте успіх атаки обмежений системними правилами контролю доступу, наприклад, коли файли заблоковані або використовуються операційною системою Windows. Крім того, в операційній системі Windows зловмисник може переміщатися лише в межах того розділу диска, де розташований веб-корінь, тоді як у системах Linux є можливість навігації по всьому диску.

Приклад вразливого коду та атаки

php<?php
$template = 'blue.php';
if ( is_set( $_COOKIE['TEMPLATE'] ) )
    $template = $_COOKIE['TEMPLATE'];
include ( "/home/users/phpguru/templates/" . $template );
?>

У цьому гіпотетичному прикладі додаток на веб-сайті example.com використовує значення з файлів cookie для завантаження шаблону без належної перевірки. Зловмисник може надіслати запит із маніпулятивним значенням параметра, замінивши назву шаблону на послідовність повернення вгору. Це змусить функцію підключення файлу вийти за межі дозволеної папки шаблонів аж до кореневого каталогу та прочитати системний файл паролів. Для обходу простих фільтрів зловмисники також можуть використовувати альтернативні кодування, такі як відсоткові послідовності %2e%2e%2f замість крапка-крапка-коса риска, подвійне кодування %252e%252e%255c або ін'єкцію нульового байта %00 для обрізання розширення файлу в операційній системі.

Як захиститись від обходу шляху

Найкращим способом захисту є повна відмова від використання вхідних даних користувача у викликах файлової системи. Замість передачі реальних імен файлів розробникам слід використовувати індекси або числові ідентифікатори, де конкретне число відповідає певному файлу на сервері. Якщо ж використання користувацького введення є неминучим, необхідно впроваджувати сувору валідацію за принципом дозволених значень.

  • Завжди нормалізуйте вхідні шляхи за допомогою відповідних системних функцій перед використанням у файлових операціях.
  • Не зберігайте конфіденційні конфігураційні файли всередині кореневого каталогу веб-сервера.
  • Для серверів Windows IIS не розміщуйте веб-корінь на системному диску, щоб запобігти рекурсивному переходу до системних папок.
  • Використовуйте ізольовані середовища chroot та політики доступу до коду для обмеження місць, звідки файли можуть бути отримані або де їх можна зберегти.
  • Переконуйтеся, що користувач не може контролювати весь шлях до файлу, оточуючи його власним кодом визначення шляху.

Поширеною помилкою є думка, що звичайної фільтрації символів крапка-крапка-коса риска достатньо для безпеки. Багато веб-контейнерів виконують автоматичне декодування відсоткових послідовностей, що дозволяє обійти прості текстові фільтри за допомогою альтернативних кодувань або специфічних для операційної системи символів розділювачів шляху. Лише комплексна валідація, нормалізація та обмеження права доступу гарантують надійний захист.