Path Traversal, znana również jako directory traversal, dot dot slash lub backtracking to rodzaj podatności, który może występować w różnych systemach i aplikacjach, gdzie użytkownik ma możliwość manipulowania ścieżkami do plików lub katalogów w celu uzyskania nieautoryzowanego dostępu do danych do których nie powinien mieć wglądu. Tego typu podatność może prowadzić do wycieku kodu aplikacji, danych konfiguracyjnych serwera, danych użytkowników, a także innych wrażliwych informacji. Przyczyną powstawania tej luki jest niewystarczająca walidacja danych wejściowych, a także źle ustawione uprawnienia do plików i katalogów. Path Traversal może stanowić podstawę dalszych ataków, np. File Inclusion (LFI lub RFI).
Pod tym linkiem znajdziesz rozwiązania zadań wraz z omówieniem z platformy Web Security Academy. Po przeczytaniu artykułu zachęcam do utrwalenia swojej wiedzy poprzez rozwiązanie tych zadań 🙂
Spis treści
Jak działa Path Traversal
Podatność Path Traversal pojawia się wtedy, gdy aplikacja wykorzystuje dane kontrolowane przez użytkownika bez odpowiedniej walidacji. W takiej sytuacji atakujący może odpowiednio zmodyfikować zapytanie, aby uzyskać dostęp do plików i wrażliwych informacji, do których normalnie nie powinien mieć dostępu. Ważne jest również to jakie są ustawione uprawnienia do plików i katalogów na serwerze. Jeśli są zbyt wysokie, wtedy atakujący może poszerzyć swój wektor ataku. Path Traversal bardzo często jest furtką do dalszych ataków takich jak LFI (Local File Inclusion) oraz RFI (Remote File Inclusion). Obie podatności zostaną omówione w dalszej części artykułu.
Path Traversal może występować bezpośrednio w adresie URL, a także w parametrach przekazywanych do aplikacji lub w nagłówkach. Luka może wystąpić w wielu miejscach aplikacji, jednak w szczególności warto testować miejsca w których pliki są pobierane lub wgrywane na serwer, a także wszędzie tam gdzie są wczytywane style lub szablony. Warto podkreślić, że podatność Path Traversal nie dotyczy tylko aplikacji webowych.
Przykładowo mamy aplikację webową, która wyświetla awatar danego użytkownika. Aplikacja wykorzystuje parametr w adresie URL, aby określić które zdjęcie powinno zostać wyświetlone.
Przykładowy adres do grafiki z awatarem ma postać:
http://example.com/image?avatar=img678.pngTak może wyglądać kod po stronie podatnej aplikacji:
<?php
$file = $_GET['avatar'];
include('var/www/images/' . $file);
?>Parametr file określa który plik graficzny ma się wyświetlać danemu użytkownikowi. W normalnych warunkach powinna się wyświetlić grafika, której nazwa znajduje się w adresie URL w parametrze avatar.
Jednak kod jest podatny na ataki path traversal, ponieważ łączy dane wejściowe dostarczone przez użytkownika ze ścieżką do pliku bez odpowiedniej walidacji. Atakujący może łatwo wykorzystać tę lukę, dostarczając ładunek, taki jak np. ../../../etc/passwd, który umożliwia przechodzenie w górę hierarchii katalogów i uzyskiwanie dostępu do poufnych plików na serwerze. Ponieważ aplikacja nie jest odpowiednio zabezpieczona, atakujący może zmodyfikować powyższy adres zmieniając parametr avatar w poniższy sposób:
http://example.com/image?avatar=../../../etc/passwdZmanipulowany kod po stronie serwera wyglądałby następująco:
<?php
$file ='../../../etc/passwd';
include('var/www/images/' . $file);
?>W efekcie serwer wskazuje pod adres:
/var/www/images/../../../etc/passwdZnak ../ oznacza przejście do katalogu nadrzędnego, tak więc w rezultacie serwer wyświetli zawartość pliku etc/passwd, zamiast grafiki z awatarem.
Jeśli nie zapewnimy odpowiedniej walidacji przekazywanych danych do naszej aplikacji, ostatnią deską ratunku będą odpowiednio niskie uprawnienia. Jeśli będą one zbyt wysokie, wtedy atakujący z powodzeniem wykona swój atak.
Czym jest File Inclusion
File Inclusion to rodzaj podatności, która pozwala atakującym na dołączenie i wykonanie kodu z plików (lokalnych lub zdalnych) w kontekście aplikacji. Często występuje w językach programowania takich jak PHP, gdzie funkcje dołączające pliki (np. include(), require()) są źle zabezpieczone. Wyróżnia się dwa rodzaje podatności File Inclusion:
- Local File Inclusion (LFI) – to luka w zabezpieczeniach aplikacji, która polega na wyświetleniu zawartości plików lub wykonaniu kodu z plików znajdujących się lokalnie na serwerze. LFI może prowadzić do dalszej eskalacji ataku. Atakujący może nawet przejąć kontrolę nad serwerem.
- Remote File Inclusion (RFI) – to luka, która pozwala atakującemu na dołączenie i wykonanie kodu z plików znajdujących się na zdalnym serwerze. W przypadku gdy aplikacja jest źle skonfigurowana (np. funkcja allow_url_include w PHP jest włączona), plik zostanie pobrany i wykonany w kontekście serwera aplikacji. W ten sposób można uruchomić złośliwy kod, który pozwala na kradzież danych, wykonanie dowolnych poleceń lub nawet przejęcie kontroli nad serwerem.
Jaka jest różnica pomiędzy Path Traversal a File Inclusion
- Charakter podatności
Path Traversal umożliwia atakującemu odczyt plików i katalogów do których nie powinien mieć dostępu.
Natomiast File Inclusion pozwala na dołączanie lub wykonywanie i odczytywanie dowolnych plików z lokalnego lub zdalnego serwera. - Wpływ na serwer
Path Traversal umożliwia atakującemu dostęp do poufnych plików i katalogów na serwerze. Może to prowadzić do kradzieży danych lub nawet przejęcia serwera.
File Inclusion umożliwia atakującemu wykonanie dowolnego kodu z pliku na serwerze. Prowadzi to do całkowitego naruszenia bezpieczeństwa serwera. - Skutek
Obie podatności mogą nieść ze sobą poważne skutki. Jednak przyjmuje się, że File Inclusion jest poważniejsza z uwagi na możliwość wykonania dowolnego kodu na serwerze. - Przyczyna
Zarówno Path Traversal, jak i File Inclusion mogą być spowodowane przez niewystarczającą walidację oraz brak odpowiedniej kontroli dostępu. Path Traversal występuje, gdy aplikacja nie może zweryfikować danych wejściowych użytkownika używanych do uzyskania dostępu do systemu plików, natomiast File Inclusion występuje, gdy dane wejściowe użytkownika są używane do dołączenia plików ze zdalnego lub lokalnego serwera bez odpowiedniej walidacji.
Jak ominąć filtry
Path Traversal jest znaną i dość popularną podatnością i w związku z tym oprogramowania klasy IDS (ang. Intrusion Detection System), czyli systemy wykrywania włamań, wykrywają i skutecznie unicestwiają znane ataki, poprzez usuwanie z zapytań ciągów ../ oraz ich wariacji. Poniżej opisuję kilka sposobów na ominięcie filtrów.
Użycie wariacji znaków . / \
Jeśli system ochrony usuwa tylko raz z zapytania sekwencję ../, bez ponownego sprawdzenia przekazanego ciągu zapytania, jest możliwe ominięcie zabezpieczeń dodając dodatkowe znaki kropek i ukośników. Takie zapytanie może mieć wtedy postać:
....//....//....//etc/passwdSekwencje w czerwonych ramkach na poniższym zrzucie są usuwane przez system zabezpieczający:

Po usunięciu powyższych znaków otrzymujemy zapytanie jak na poniższym rzucie:

Jak widzisz system zabezpieczający powinien dokonać rekurencyjnej walidacji.
Kodowanie znaków
Jeśli jednak system zabezpieczający działa prawidłowo w powyższym zakresie, możesz zastosować:
- kodowanie URL (
.=%2E,/=%2F,\=%5C) - podwójne kodowanie URL (
.=%252E,/=%252F,\=%255C) - kodowanie UTF-16 (
.=%u002e,/=%u2215,\=%u2216) - pojedyncze lub wielokrotne kodowanie UTF-8 (
.=%c0%2e,/=%c0%af,\=%c0%5c).
Poniżej zestawienie w tabelce:
| Znak wyjściowy | . | / | \ |
| Kodowanie procentowe URL | %2E | %2F | %5C |
| Kodowanie podwójne procentowe URL | %252E | %252F | %255C |
| Kodowanie UTF-16 | %u002e | %u2215 | %u2216 |
| Pojedyncze kodowanie UTF-8 | %c0%2e | %c0%af | %c0%5c |
Można również mieszać ze sobą różne rodzaje kodowania, aby utrudnić detekcję. W niektórych systemach można zamienić zwykłe ukośniki na odwrotne.
Zastosowanie bajtu zerowego
W sytuacji gdy aplikacja wymaga, aby podana przez użytkownika nazwa pliku kończyła się oczekiwanym rozszerzeniem, np. .png, wówczas możliwe jest użycie bajtu zerowego, aby skutecznie zakończyć ścieżkę pliku przed wymaganym rozszerzeniem:
filename=../../../etc/passwd%00.pngBajt zerowy (inaczej znak pusty, null character) jest zdefiniowany w standardach ASCII i Unicode Bajt. Oznacza koniec łańcucha. Bajt zerowy jest oznaczony: %00. Wszystko co się za nim znajduje jest ignorowane.
Użycie ścieżki bezwzględnej
Czasem może być tak, że aplikacja pozwala na użycie ścieżki bezwzględnej. Więcej na ten temat przeczytasz w tym artykule: Podatność Path Traversal – rozwiązanie zadań PortSwigger wraz z omówieniem.
Narzędzia do lokalizowania podatności Path Traversal
Podatności Path Traversal można szukać ręcznie. W takim przypadku wystarczy program Burp Suite lub OWASP ZAP, za pomocą których możemy przechwytywać zapytania i je modyfikować.
Drugą opcją jest skorzystanie z automatycznych skanerów podatności np. DotDotPwn. Oczywiście wyższej wymienione programy również posiadają zaawansowane skanery.
Poniższej znajdziesz listę narzędzi, które są bardzo pomocne w szukaniu podatności Path Traversal:
- Burp Suite – jest to najpopularniejsze narzędzie do przechwytywania i modyfikowania zapytań do serwera. W wersji Community dostępny jest moduł Intruder za pomocą którego można sprawdzić dostępność popularnych lokacji na serwerach poprzez fuzzing. Należy jednak zaznaczyć, że w bezpłatnej wersji szybkość fuzzowania jest znacznie wolniejsza niż w wersji Professional. Ponadto w wersji płatnej do dyspozycji mamy skaner, który potrafi wykryć m.in. podatność Path Traversal.
- OWASP ZAP (Zed Attack Proxy) – jest to alternatywa dla Burp Suite. OWASP ZAP jest narzędziem open source i jest rozwijany przez Open Web Application Security Project (OWASP). OWASP ZAP również posiada skaner podatności i jest dostępny w pełni za free.
- DirBuster – narzędzie to również jest rozwijane przez OWASP. Za jego pomocą można zlokalizować ukryte pliki i katalogi poprzez fuzzing.
- DotDotPwn – narzędzie to, jak sama nazwa wskazuje, jest specjalnie zaprojektowane do testowania luk w zabezpieczeniach typu Directory Traversal. Działa poprzez wysyłanie specjalnie spreparowanych żądań do serwera i analizowanie odpowiedzi.
Czym może skutkować obecność Path Traversal i File Insclusion w aplikacji
Wykorzystanie luki w zabezpieczeniach typu Path Traversal oraz File Inclusion może prowadzić do różnych konsekwencji, w zależności od specyfiki podatności, a także konfiguracji serwera, np.:
- Odczyt dowolnych plików – najprostszym sposobem wykorzystania tej podatności jest uzyskanie dostępu do dowolnych katalogów oraz plików na serwerze. Może to skutkować ujawnieniem poufnych informacji, takich jak pliki konfiguracyjne, kod źródłowy aplikacji, dane do logowania do bazy danych, itp. Tego typu wyciek danych może stanowić poważne zagrożenie dla bezpieczeństwa całego systemu. Warto również wspomnieć o tym, że w niektórych przypadkach możliwe jest również wylistowanie zawartości danego katalogu.
- Wgrywanie dowolnych plików – w pewnych sytuacjach atakujący może wykorzystać podatność do wgrywania swoich plików na serwer. Przykładowo atakujący może zmodyfikować plik konfiguracyjny, co może zakłócić działanie aplikacji lub nawet pozwolić atakującemu na uruchomienie własnego kodu. Atakujący może też nadpisać plik z danymi, co może skutkować ich utratą lub uszkodzeniem.
- Wykonanie kodu na serwerze – w niektórych przypadkach atakujący może wykorzystać podatność do uruchomienia dowolnego kodu na serwerze. Zazwyczaj osiąga się to poprzez zapisanie pliku, który później zostanie wykonany przez serwer. Jeśli aplikacja internetowa działa w PHP i atakujący może dzięki luce zapisać plik z rozszerzeniem .php na serwerze, może później wymusić jego uruchomienie przez serwer. W efekcie serwer wykona kod zawarty w pliku, co pozwoli atakującemu przejąć nad nim kontrolę.
Jak zabezpieczyć swoją aplikację przed Path Traversal
Odpowiednia walidacja
Upewnij się, że wszystkie dane wejściowe, które są kontrolowane przez użytkownika są prawidłowo walidowane i oczyszczane. Jest to kluczowy krok, aby uniemożliwić atakującym manipulowanie ścieżkami oraz dołączanie złośliwych plików.
Unikaj czarnych list
Czarna lista jest złą praktyką, ponieważ istnieje więcej sposobów na wykonanie tego samego żądania. Sprytni atakujący zawsze znajdą sposoby na ominięcie ograniczeń dla danych wejściowych dostarczanych przez użytkownika. Na przykład ../../../etc/ można również zapisać w następujący sposób: ..%2F..%2F..%2Fetc%2F.
Jeśli chcesz mieć dostęp do określonych plików, użyj białą listę obejmującą pliki, które mogą być dołączane do żądania. Jeśli to możliwe, odrzuć każde żądanie, które nie spełnia tych kryteriów.
Odpowiednio skonfiguruj serwer
Skonfiguruj ustawienia serwera, tak aby uniemożliwić zdalne dołączanie plików, a także ograniczyć możliwość dostępu skryptów do systemu plików. W przypadku PHP dyrektywy takie jak allow_url_fopen i allow_url_include powinny być wyłączone, jeśli nie są potrzebne do działania aplikacji.
Regularnie testuj swoją aplikację
Warto regularnie przeprowadzać audyty bezpieczeństwa aplikacji pod kątem występowania potencjalnych luk. Zadanie to możemy sobie ułatwić korzystając z zautomatyzowanych narzędzi. Pamiętaj jednak, że nie zawsze skaner wykryje wszystkie luki. Dlatego właśnie warto także przeprowadzić ręczną kontrolę.
Podsumowanie
Luki w zabezpieczeniach związane z przechodzeniem przez ścieżki stanowią poważne zagrożenie, które może skutkować ujawnieniem poufnych danych lub nawet wykonaniem dowolnego kodu. Pomimo, że Path Traversal i File Inclusion nie są nowymi podatnościami, ale nadal można je znaleźć w różnego rodzajach aplikacjach. Programiści powinni zdawać sobie sprawę z tego ryzyka i podjąć działania, aby je ograniczyć w swoich projektach.

