Na stronie PortSwigger w dziale Web Security Academy jest dostępnych 6 zadań, dzięki którym możemy poćwiczyć wykorzystanie podatności Path Traversal. W poradniku pokażę rozwiązanie tych zadań. Sądzę że warto rozumieć czym jest Path Traversal, żeby potem móc jej szukać w rzeczywistych aplikacjach, ponieważ pomimo że jest to stara podatność, nadal się pojawia.

Spis treści
File Path Traversal simple – zadanie numer 1
Żeby rozwiązać to zadanie musimy wyświetlić zawartość pliku etc/passwd. Jest to plik który standardowo występuje w systemie Linux. W pliku tym znajdują się informacje na temat zarejestrowanych użytkowników w danym systemie. W opisie zadania mamy wskazówkę, że luka znajduje się w mechanizmie odpowiedzialnym za wyświetlanie zdjęć produktowych.
Treść laboratorium:

Zajrzyjmy jak wygląda pierwsze laboratorium. Jest to sklep internetowy. Jeśli klikniemy w dany produkt, możemy zauważyć, że przy każdym produkcie są gwiazdki z oceną, cena, zdjęcie, opis oraz link powrotny. Ponieważ w opisie zadania jest informacja, że luka znajduje się w mechanizmie wyświetlania obrazków produktów, musimy bliżej się temu przyjrzeć.
Otwórzmy zdjęcie dowolnego produktu w nowej zakładce, żeby zobaczyć jaką strukturę ma adres URL:

Zauważ, że nazwa obrazka jest wartością przekazywaną do parametru filename.
Dla porównania sprawdźmy adres URL grafiki przy innym produkcie:

Adres URL tych dwóch obrazków różni się tylko wartością parametru filename.
Zajrzyjmy jeszcze do źródła strony w miejscu gdzie wyświetla się nasza grafika:

Możemy z tego wywnioskować, że z adresu URL jest pobierana nazwa obrazka w formie jawnej i jest przekazywana do kodu odpowiedzialnego za wyświetlanie grafiki na stronie. Tak więc w tym miejscu spróbujemy dodać nasz payload, czyli przekażemy zmodyfikowaną wartość do parametru filename.
Odpalmy program Burp Suite. W zakładce Proxy -> HTTP History znajdujemy żądanie wyświetlenia grafiki do wybranego produktu. Niestety u mnie nie widać tego żądania, ponieważ w filtrowaniu mam wyłączony ten typ żądania

Żeby to włączyć, w zakładce Proxy -> HTTP History kliknij Filter settings: Hiding CSS and general binary content. Następnie zaznacz checkbox Images.

Od teraz interesujące nas żądanie pojawiło się w historii. Klikamy na nie prawym przyciskiem myszy i wysyłamy do Repeatera. Dzięki temu będziemy mogli zmodyfikować je dodając nasz payload i ponownie wysyłając do serwera.

Teraz spróbujemy przejść o jeden katalog wyżej i wyświetlić zawartość etc/passwd zastępując nazwę pliku w parametrze filename sekwencją:
../etc/passwdPo wpisaniu naszego payloada w parametrze filename klikamy przycisk Send. W ten sposób wyślemy zmodyfikowane żądanie do serwera. Niestety w odpowiedzi mamy informację „No such file”, tak więc payload nie zadziałał.

Spróbujmy przejść o jeszcze jeden katalog wyżej dodając sekwencję ../
../../etc/passwd
Niestety nadal nie działa. Spróbujmy przejść jeszcze wyżej:
../../../etc/passwd
Udało się. W odpowiedzi otrzymaliśmy zawartość pliku etc/passwd.
File Path Traversal, traversal sequences blocked with absolute path bypass – zadanie numer 2
Treść zadania:

Tu również luka znajduje się w mechanizmie wyświetlania obrazka produktu i też musimy odczytać zawartość pliku etc/passwd. Jednak aplikacja blokuje sekwencje przechodzenia do katalogu wyżej, tak więc sekwencja ../ raczej tu nie zadziała, ale i tak spróbujemy jej użyć 😉
Odpalamy Burp Suite, przechodzimy na podstronę z wybranym produktem. Następnie z poziomu Burp Suite przechodzimy do zakładki Proxy -> HTTP History i znajdujemy żądanie wyświetlenia grafiki do wybranego produktu. Jeśli żądanie się u Ciebie nie wyświetla, patrz punkt wyżej (w poprzednim zadaniu wyjaśniam co należy zrobić).
Następnie przesyłamy żądanie do Repeatera i wstawiamy w parametrze filename payload z poprzedniego laboratorium:

Tak jak przypuszczaliśmy, to nie zadziała. W aplikacji został wdrożony mechanizm zabezpieczający, który usuwa z zapytania ciąg znaków ../, tak więc musimy jakoś to ominąć.
W opisie laboratorium mamy wskazówkę „treats the supplied filename as being relative to a default working directory”. Chodzi o to, że wartość przekazana w parametrze filename (domyślnie jest to nazwa pliku wraz z rozszerzeniem) traktowana jest jako względna (relatywna) w stosunku do domyślnego katalogu roboczego. Przypomnijmy sobie czym jest ścieżka względna (relatywna) oraz bezwzględna (absolutna):
Ścieżka względna (relatywna) – określa lokalizację pliku lub folderu w odniesieniu do bieżącego katalogu.
Przykład ścieżki względnej:
./images/45.jpg
gdzie:
. (znak kropki) – oznacza bieżący katalog,
images – nazwa folderu w którym znajduje się nasz plik,
45.jpg – nazwa pliku graficznego, który chcemy odczytać.
Ścieżka bezwzględna (absolutna) – określa pełną ścieżkę począwszy od katalogu głównego aż do wybranego katalogu lub pliku, czyli zaczyna się aż od korzenia systemu plików do danego pliku.
Przykłady ścieżki bezwzględnej:
/var/www/images/45.jpg
/etc/passwd
W tym laboratorium aplikacja usuwa z zapytania sekwencję ../, tak więc nie możemy w ten sposób wyjść poza bieżący katalog. Spróbujmy zatem podać absolutną ścieżkę do pliku passwd. Plik ten znajduje się w lokalizacji:
/etc/passwdJak widzimy na poniższym zrzucie udało nam się obejść zabezpieczenie.

File Path Traversal, traversal sequences stripped non-recursively – zadanie numer 3
W kolejnym laboratorium również musimy wyświetlić zawartość pliku etc/passwd. Luka też jest w mechanizmie wyświetlania obrazków produktów. Tu też jest wdrożony mechanizm zabezpieczający, który usuwa sekwencję ../
Treść zadania:

W tym laboratorium nie zadziałają payloady z poprzednich zadań:
../../../etc/passwd/etc/passwd
Czasem zdarza się tak, że mechanizm zabezpieczający usuwa sekwencję ../ bez ponownego sprawdzania żądania. Po prostu usuwane jest tylko pierwsze wystąpienie sekwencji ../
Żeby to sprawdzić do naszego żądania dodajmy poniższy payload:
....//....//....//etc/passwdMechanizm zabezpieczający usunie poniższe znaki:

Po tym zabiegu nasze zapytanie będzie miało odpowiednią strukturę:

Sprawdźmy czy to zadziała.



Udało nam się wyświetlić zawartość pliku passwd.
File Path Traversal, traversal sequences stripped with superfluous URL-decode – zadanie numer 4
W kolejnym zadaniu również musimy wyświetlić zawartość pliku etc/passwd. Luka też jest w mechanizmie wyświetlania obrazków produktów.
Treść zadania:

Dużą wskazówkę znajdujemy w opisie tego laboratorium. Sekwencja przechodzenia do katalogu nadrzędnego (czyli ../) jest usuwana z zapytania, ale mechanizm zanim użyje przekazanych danych w parametrze filename wykonuje dekodowanie adresu URL. Czyli dekoduje ciąg znaków zakodowanych za pomocą kodowania URL (kodowanie procentowe) na tekst jawny.
Na pewno payloady z poprzednich zadań nie zadziałają:
../../../etc/passwd/etc/passwd....//....//....//etc/passwd
Jednak co się stanie, jeśli zakodujemy sekwencję ../ za pomocą kodowania URL? Wtedy system zabezpieczający „nie zobaczy”, że jest to sekwencja ../, więc przepuści nasz payload i zrobi na nim dekodowanie.
Czym jest kodowanie URL?
Kodowanie URL (ang. URL encoding), zwane także kodowaniem procentowym, to proces przekształcania znaków w adresie URL na format, który jest zrozumiały dla przeglądarek oraz serwerów. Adresy URL mogą zawierać tylko określony zestaw znaków (litery, cyfry oraz kilka znaków specjalnych), a znaki, które nie są w tym zestawie, muszą być zakodowane. Podczas kodowania URL każdy nieakceptowany znak jest zamieniany na poprzedzoną znakiem procenta (%) dwucyfrową wartość heksadecymalną zapisaną w ASCII np.:
- Spacja ( ) jest kodowana jako %20
- Znak & jest kodowany jako %26
- Polskie znaki, jak ł czy ę, również są zamieniane na ich reprezentację w kodzie procentowym.
URL bez kodowania:
https://example.com/szukaj?zapytanie=Nowy Jork & kultura
Zakodowany URL:
https://example.com/szukaj?zapytanie=Nowy%20Jork%20%26%20kultura
Najpierw spróbujemy zakodować ciąg: ../../../
| Znak | Kodowanie URL |
|---|---|
| . | %2E |
| / | %2F |
Zatem poniższa sekwencja:
../../../etc/passwdbędzie mieć postać:
%2E%2E%2F%2E%2E%2F%2E%2E%2Fetc/passwdSprawdźmy czy to zadziała.



Niestety to nie zadziałało, ale możemy jeszcze spróbować użyć podwójnego kodowania. Czyli najpierw kodujemy ciąg ../../../, a potem jeszcze raz kodujemy ciąg %2E%2E%2F%2E%2E%2F%2E%2E%2F
| Znak | Kodowanie URL | Podwójne kodowanie URL |
|---|---|---|
| . | %2E | %252E |
| / | %2F | %252F |
Ostatecznie nasz payload będzie miał postać:
%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc/passwd
Tym razem nasz payload zadziałał.
File Path Traversal, validation of start of path – zadanie numer 5
W kolejnym zadaniu również musimy wyświetlić zawartość pliku etc/passwd. Luka też jest w mechanizmie wyświetlania obrazków produktów.
Treść zadania:

Spójrzmy na źródło strony. Jak widać na poniższym zrzucie parametr filename zawiera pełną ścieżkę do obrazka:

/image?filename=/var/www/images/48.jpgAplikacja sprawdza, czy ścieżka zaczyna się od oczekiwanych wartości, w tym przypadku ścieżki bezwzględnej /var/www/images.
Sprawdźmy, czy możliwe jest użycie poniższego payloadu. Zostawiamy początek ścieżki, czyli fragment który jest sprawdzany przez mechanizm zabezpieczający. Następnie próbujemy wyjść ponad te katalogi za pomocą sekwencji ../
/var/www/images/../../../etc/passwd
File Path Traversal, validation of file extension with null byte bypass – zadanie numer 6

W kolejnym zadaniu również musimy wyświetlić zawartość pliku etc/passwd. Luka też jest w mechanizmie wyświetlania obrazków produktów. Jest za to pewne utrudnienie polegające na tym, że mechanizm zabezpieczający sprawdza, że czy podana nazwa pliku kończy się oczekiwanym rozszerzeniem.
Jak można przypuszczać, poniższy payload nie zadziała:
filename=../../../etc/passwd
Na końcu zapytania brakuje rozszerzenia .png. Zatem dodajmy je, jednak w tym celu musimy użyć bajtu zerowego:
filename=../../../etc/passwd%00.pngTo zapytanie zadziałało:

Bajt 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. Zatem w ten sposób oszukaliśmy mechanizm zabezpieczający w tym zadaniu, który tylko sprawdził czy na końcu tego zapytania znajduje się rozszerzenie .png.

