Podatność Path Traversal – rozwiązanie zadań PortSwigger wraz z omówieniem

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.

path traversal laboratorium portswigger

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:

File path traversal, simple case

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:

File path traversal, simple case

Zauważ, że nazwa obrazka jest wartością przekazywaną do parametru filename.

Dla porównania sprawdźmy adres URL grafiki przy innym produkcie:

File path traversal, simple case

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:

File path traversal, simple case

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

File path traversal, simple case

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

File path traversal, simple case

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.

path traversal zadanie z websecurity academy

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/passwd

Po 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ł.

path traversal portswigger zadanie

Spróbujmy przejść o jeszcze jeden katalog wyżej dodając sekwencję ../

../../etc/passwd
path traversal portswigger zadanie

Niestety nadal nie działa. Spróbujmy przejść jeszcze wyżej:

../../../etc/passwd
path traversal zadanie z websecurity academy

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:

File path traversal, traversal sequences blocked with absolute path bypass

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:

File path traversal, traversal sequences blocked with absolute path bypass

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):

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/passwd

Jak widzimy na poniższym zrzucie udało nam się obejść zabezpieczenie.

File path traversal, traversal sequences blocked with absolute path bypass

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:

File path traversal, traversal sequences stripped non-recursively

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/passwd

Mechanizm zabezpieczający usunie poniższe znaki:

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

Sprawdźmy czy to zadziała.

File path traversal, traversal sequences stripped non-recursively
File path traversal, traversal sequences stripped non-recursively
File path traversal, traversal sequences stripped non-recursively

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:

File path traversal, traversal sequences stripped with superfluous URL-decode

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.

Najpierw spróbujemy zakodować ciąg: ../../../

ZnakKodowanie URL
.%2E
/%2F

Zatem poniższa sekwencja:

../../../etc/passwd

będzie mieć postać:

%2E%2E%2F%2E%2E%2F%2E%2E%2Fetc/passwd

Sprawdź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

ZnakKodowanie URLPodwójne kodowanie URL
.%2E%252E
/%2F%252F

Ostatecznie nasz payload będzie miał postać:

%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc/passwd
File path traversal, traversal sequences stripped with superfluous URL-decode

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:

File path traversal, validation of start of path

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

File path traversal, validation of start of path
/image?filename=/var/www/images/48.jpg

Aplikacja 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
File path traversal, validation of file extension with null byte bypass

Na końcu zapytania brakuje rozszerzenia .png. Zatem dodajmy je, jednak w tym celu musimy użyć bajtu zerowego:

filename=../../../etc/passwd%00.png

To zapytanie zadziałało:

File path traversal, validation of file extension with null byte bypass
Podziel się swoją opinią
Subskrybuj
Powiadom o
guest
0 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments

    Pakiet na sklep PREMIUM

      Pakiet na sklep BASIC

        Strona internetowa pakiet BUSINESS

          Strona internetowa pakiet PREMIUM

            Strona internetowa pakiet BASIC

                Pakiet na opiekę przez miesiąc

                  Pakiet na opiekę przez 3 miesiące

                    Pakiet na opiekę przez 6 miesięcy