path traversal
| Po angielsku | path traversal |
|---|---|
| Którą formą pisać | po angielsku Polski odpowiednik istnieje, ale w praktyce nikt tak nie pisze. Zostaw angielski, polski trzymaj jako synonim. |
| Inne formy | wyjście poza katalog · manipulacja ścieżką |
| Kategoria | Podatnoś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.
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].
| Zapis | Znaczenie 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]:
- odczyt nieoczekiwanych plików i ujawnienie informacji;
- tworzenie i nadpisywanie plików z danymi;
- zdalne wykonanie kodu (remote code execution) przez nadpisanie plików wykonywalnych lub bibliotek;
- odmowę usługi przez usunięcie lub uszkodzenie plików krytycznych.
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].
Przypisy
7- [1] CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') · MITRE
- [2] Path Traversal · OWASP
- [3] 2024 CWE Top 25 Most Dangerous Software Weaknesses · MITRE
- [4] Czym jest podatność Path Traversal? · Sekurak
- [5] validate_file() — Function Reference · WordPress.org
- [6] Podatności w oprogramowaniu Quick.CMS (CVE-2026-63301 – CVE-2026-63303) · CERT Polska
- [7] Podatności w oprogramowaniu ATutor (CVE-2026-64960 – CVE-2026-64972) · CERT Polska
Hasła w tym artykule
13- podatność
- CWE
- LFI (Local File Inclusion)
- wgranie dowolnego pliku (arbitrary file upload)
- usunięcie dowolnego pliku
- podatność we wtyczce
- podatność w motywie
- klucze bezpieczeństwa i sole
- utwardzanie pliku wp-config.php
- sanityzacja danych wejściowych
- ujawnienie informacji
- zdalne wykonanie kodu (RCE)
- uprawnienia plików
Linkują tutaj
17- podatność
- exploit
- CWE
- sanityzacja danych wejściowych
- utwardzanie pliku wp-config.php
- wgranie dowolnego pliku (arbitrary file upload)
- podatność wykorzystywana bez uwierzytelnienia
- tryb debugowania na produkcji
- PHP object injection
- RFI (Remote File Inclusion)
- LFI (Local File Inclusion)
- XXE
- ujawnienie informacji
- usunięcie dowolnego pliku
- cross-site contamination
- HSM
- skanowanie podatności