Blog 24/7

path traversal

TAB. 1Hasłopo angielsku
Po angielskupath traversal
Którą formą pisaćpo angielsku Polski odpowiednik istnieje, ale w praktyce nikt tak nie pisze. Zostaw angielski, polski trzymaj jako synonim.
Inne formywyjście poza katalog · manipulacja ścieżką
KategoriaPodatności i klasy błędów

Path traversal to podatność, w której aplikacja buduje ścieżkę do pliku z danych od użytkownika i nie neutralizuje elementów pozwalających wyjść poza katalog, do którego dostęp miał być ograniczony [1]. MITRE katalogizuje ją jako CWE-22 [1]. OWASP opisuje atak jako próbę dostępu do plików i katalogów przechowywanych poza katalogiem głównym serwisu WWW i podaje nazwy zamienne: dot-dot-slash, directory climbing i backtracking [2]. W zestawieniu CWE Top 25 za 2024 rok path traversal zajął piąte miejsce, o trzy pozycje wyżej niż rok wcześniej [3].

Jak działa

Aplikacja otrzymuje nazwę pliku, na przykład szablonu, obrazka albo raportu do pobrania, i dokleja ją do katalogu bazowego. Jeśli nazwa zawiera sekwencję ../, system plików interpretuje ją jako przejście piętro wyżej. Sekurak opisuje ten mechanizm jako manipulację ścieżką przez dodawanie ciągu znaków ../ [4]. Kilka takich sekwencji wyprowadza ścieżkę poza katalog aplikacji.

RYS. 1Path traversal w parametrze pobierania

Najprostsza podatna konstrukcja w PHP wygląda tak:

$file = $_GET['file'];
readfile( __DIR__ . '/pobierz/' . $file ); // podatne
// żądanie: /pobierz.php?file=../../../etc/passwd

OWASP pokazuje podobny przykład, w którym wartość ciasteczka z sekwencjami ../ prowadzi do odczytu uniksowego pliku haseł [2].

Odmiany

MITRE wyróżnia dwa warianty [1]. Odmiana względna używa sekwencji ../, żeby wyjść w górę drzewa katalogów. Odmiana bezwzględna podaje pełną ścieżkę, na przykład /etc/passwd, i omija ograniczenie, jeśli aplikacja nie sprawdza, czy ścieżka zaczyna się od katalogu bazowego [1].

Filtry, które usuwają tylko jeden zapis sekwencji, można obejść kodowaniem. OWASP i Sekurak podają między innymi te warianty [2] [4].

ZapisZnaczenie po dekodowaniu
%2e%2e%2f../ [2]
..%2f../ [2]
%2e%2e%5c..\ (Windows) [2]
....//../ po jednokrotnym usunięciu środka [4]

MITRE zwraca uwagę, że filtrowanie tylko ukośnika nie wystarczy tam, gdzie system plików przyjmuje też ukośnik wsteczny, a podwójne kodowanie omija filtry stosowane kolejno [1]. Na Windows przejście ogranicza się do partycji z katalogiem serwisu, a na systemach uniksowych możliwa jest nawigacja od korzenia dysku [2].

Path traversal łączy się z innymi klasami błędów. Gdy odczytany plik jest dołączany jako kod, powstaje LFI (Local File Inclusion). Gdy ścieżka służy do zapisu, błąd przechodzi w wgranie dowolnego pliku albo w usunięcie dowolnego pliku.

W WordPressie

W WordPressie path traversal występuje głównie we wtyczkach i motywach, które przyjmują nazwę pliku w parametrze: moduły pobierania załączników, podglądu logów, importu i eksportu, zmiany szablonu; zob. podatność we wtyczce i podatność w motywie. Najczęstszym celem odczytu jest wp-config.php, który przechowuje dane dostępu do bazy danych i klucze bezpieczeństwa i sole. Dlatego znaczenie ma utwardzanie pliku wp-config.php.

Rdzeń udostępnia funkcję validate_file(), która sprawdza nazwę i ścieżkę pliku według ustalonych reguł [5]. Zwraca 0, gdy wszystko jest w porządku, 1, gdy ścieżka zawiera przejście między katalogami, 2, gdy zawiera ścieżkę dysku Windows, i 3, gdy pliku nie ma na liście dozwolonych [5].

$name = sanitize_file_name( wp_unslash( $_GET['file'] ) );
if ( 0 !== validate_file( $name, array( 'raport.pdf', 'cennik.pdf' ) ) ) {
    wp_die( 'Niedozwolony plik', 400 );
}

Lista dozwolonych nazw jest tu ważniejsza niż samo czyszczenie. Sanityzacja usuwa niebezpieczne znaki, ale dopiero porównanie z listą ogranicza wybór do plików przewidzianych przez autora.

Zagrożenia i skutki

MITRE wymienia cztery grupy skutków [1]:

Sekurak wymienia jako cele atakujących pliki konfiguracyjne, dane dostępowe, historię poleceń powłoki i konfigurację serwerów wirtualnych [4]. Odczytane hasło do bazy albo klucz API otwiera drogę do dalszych ataków, dlatego skutek odczytu bywa poważniejszy, niż sugeruje sam typ błędu.

Jak się bronić

MITRE zaleca kanonizację ścieżki, na przykład funkcją realpath(), przed jej sprawdzeniem, walidację wejścia z listą dozwolonych wartości zamiast niepełnej listy zakazanych oraz mapowanie danych od użytkownika na stały zbiór wartości [1]. Jako dodatkową warstwę wskazuje ograniczenie dostępu procesu do systemu plików, na przykład przez chroot albo AppArmor [1]. Sekurak zaleca identyfikowanie plików przez UUID zamiast ścieżek i odpowiednie uprawnienia w systemie plików [4]; zob. uprawnienia plików.

$base = realpath( WP_CONTENT_DIR . '/raporty' );
$path = realpath( $base . '/' . $name );
if ( false === $path || 0 !== strpos( $path, $base . DIRECTORY_SEPARATOR ) ) {
    wp_die( 'Poza katalogiem', 403 );
}

Zasada jest jedna: najpierw ustalić rzeczywistą ścieżkę, potem sprawdzić, czy leży w katalogu bazowym.

Sekurak przestrzega przed jednokrotnym usuwaniem sekwencji ../ z parametru, bo zapis ....// po takim czyszczeniu znów daje ../; jeśli filtr w ogóle jest stosowany, musi działać do skutku [4]. Filtry oparte na liście zakazanych ciągów pozostają jednak słabsze od listy dozwolonych wartości, co podkreśla także MITRE [1].

Historia i przykłady

Sekurak w artykule z 3 sierpnia 2017 roku przytacza starsze przypadki [4]. W serwerze GlassFish w sierpniu 2015 roku możliwe było odczytanie dowolnego pliku z dysku, a w serwerze ColoradoFTP 1.3 manipulacja ścieżką pozwalała zapisywać pliki w katalogu systemowym Windows [4]. Oba przykłady pokazują, że ten sam błąd służy zarówno do odczytu, jak i do zapisu.

28 lipca 2026 roku CERT Polska opublikował informację o podatnościach w Quick.CMS firmy OpenSolution [6]. CVE-2026-63303 to path traversal w komponencie ścieżki URI: serwer nie normalizuje sekwencji ../ i uwierzytelniony administrator może odczytać pliki w katalogu równoległym do katalogu głównego serwisu [6]. Testowana była wersja 6.8; producent ocenił prawdopodobieństwo wykorzystania jako bardzo niskie i uznał naprawę za niekonieczną [6].

20 sierpnia 2026 roku CERT Polska opisał podatności w ATutor 2.2.4 [7]. CVE-2026-64966 to path traversal przy rozpakowywaniu archiwów ZIP: instruktor mógł zapisać plik .phtml w katalogu głównym aplikacji i doprowadzić do zdalnego wykonania kodu [7]. CVE-2026-64967 dotyczy przeglądarki logów błędów, przez którą administrator miał dostęp do plików poza wyznaczonym katalogiem [7].

TAB. 2

Przypisy

7
  1. [1] CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') · MITRE
  2. [2] Path Traversal · OWASP
  3. [3] 2024 CWE Top 25 Most Dangerous Software Weaknesses · MITRE
  4. [4] Czym jest podatność Path Traversal? · Sekurak
  5. [5] validate_file() — Function Reference · WordPress.org
  6. [6] Podatności w oprogramowaniu Quick.CMS (CVE-2026-63301 – CVE-2026-63303) · CERT Polska
  7. [7] Podatności w oprogramowaniu ATutor (CVE-2026-64960 – CVE-2026-64972) · CERT Polska
TAB. 3

Hasła w tym artykule

13
TAB. 4

Linkują tutaj

17

Wszystkie kategorie → · Hasło w słowniku →

Blog 24/7
05.11CISA i FBI wzywają do zabezpieczenia sterowników chłodzenia po atakach w Europietherecord.media05.11Midnight Blizzard atakowała iPhone'y i Androidy przez zainfekowane strony w Europie i USAsecurityweek.com05.11APT29 kradła dane z iPhone'ów i Androidów przez przejęte i podrobione stronytherecord.media05.11Grupa APT29 przejęła skrypt Plerdy i atakowała niezałatane iPhone'y i Androidythehackernews.com05.11Microsoft wykrył 7,3 mld wiadomości phishingowych w III kwartale 2026microsoft.com05.11DigiCert ujawnia wyciek danych klientów i skanów dokumentów tożsamościbleepingcomputer.com05.11CWPdoor podmienia serwer cwpsrv w Control Web Panel i otwiera tylne wejście do Linuksableepingcomputer.com05.11Brytyjskie NCSC ostrzega, że narzędzia AI zwiększyły liczbę wykrywanych luk zero-daythehackernews.com05.11Skaner RootEvidence sprawdza starą lukę w Cisco IOS i dodaje nagłówki Opt-Outisc.sans.edu05.11Włamanie do portalu grantowego Norad, zagrożone dane 20 614 użytkownikówhelpnetsecurity.com