listowanie katalogów
| Po angielsku | directory listing (directory indexing) |
|---|---|
| Którą formą pisać | obie formy Obie formy są w obiegu. Przy pierwszym wystąpieniu pisz „polski termin (english term)”, dalej sam polski. |
| Inne formy | directory listing · listing katalogu · listing plików · indeksowanie katalogów · Options -Indexes |
| Kategoria | Podatności i klasy błędów |
Listowanie katalogów (directory listing) to funkcja serwera WWW, która przy braku pliku startowego w katalogu wyświetla listę wszystkich znajdujących się w nim plików. Sekurak opisuje ją jako wyświetlanie użytkownikowi zawartości katalogu, jeśli ten nie zawiera pliku index [6]. Włączone tam, gdzie nie jest potrzebne, staje się słabością: MITRE klasyfikuje je jako CWE-548, czyli niewłaściwe ujawnienie listy wszystkich zasobów znajdujących się w katalogu [1]. Samo w sobie nie daje dostępu do systemu, ale pokazuje pliki, które nie miały być widoczne.
Jak działa
Gdy żądanie wskazuje katalog, a nie plik, serwer najpierw szuka pliku startowego. W Apache indeks katalogu pochodzi z jednego z dwóch źródeł: z pliku w tym katalogu, zwykle index.html, wskazanego dyrektywą DirectoryIndex, albo z listy wygenerowanej przez serwer [2]. Automatyczne generowanie listy włącza się ustawieniem Options +Indexes [2]. W nginx listę tworzy moduł ngx_http_autoindex_module, do którego żądanie zakończone ukośnikiem trafia zwykle wtedy, gdy moduł indeksu nie znajdzie pliku startowego [3].
Decyzję serwera pokazuje schemat poniżej.
Dokumentacja WordPressa opisuje opcję Indexes dyrektywy Options tak: jeśli adres wskazuje katalog i nie ma pliku DirectoryIndex, serwer zwraca sformatowaną listę katalogu [4]. Opcje poprzedzone znakiem plus są dodawane do obowiązujących, a poprzedzone minusem usuwane [4].
W WordPressie
Instalacja WordPressa ma wiele katalogów dostępnych przez przeglądarkę: wp-content/uploads z plikami mediów, wp-content/plugins i wp-content/themes. W repozytorium WordPressa katalog wp-content zawiera plik index.php z jedynym komentarzem „Silence is golden” [5]. Taki pusty plik staje się plikiem startowym, więc serwer wyświetla pustą stronę zamiast listy. Działa on jednak tylko w katalogu, w którym leży, bo indeks katalogu pochodzi z pliku w tym właśnie katalogu [2].
Na stronie WordPress listowanie katalogów może ujawnić:
- pełną listę mediów, także tych, których nie podlinkowano w treści;
- nazwy katalogów wtyczek i motywów, czyli mapę powierzchni ataku;
- kopie zapasowe, eksporty bazy i logi zostawione w katalogach publicznych, czyli publicznie dostępne pliki wrażliwe.
Na serwerze Apache wyłącza się je jedną linią w pliku .htaccess albo w konfiguracji serwera. To typowy element, który opisują zabezpieczenia w .htaccess.
Options -Indexes
W nginx ten sam efekt daje brak dyrektywy autoindex on, bo wartością domyślną jest autoindex off [3].
| Serwer | Co włącza listę | Co ją wyłącza |
|---|---|---|
| Apache | Options +Indexes [2] | Options -Indexes [4] |
| nginx | autoindex on [3] | autoindex off, wartość domyślna [3] |
| Dowolny | brak pliku startowego w katalogu [2] | pusty index.php w katalogu [5] |
Zagrożenia i skutki
Listowanie jest problemem konfiguracji, a nie błędem w kodzie aplikacji. Tę samą stronę można zabezpieczyć albo odsłonić wyłącznie ustawieniem serwera, bez zmiany ani jednej linii w motywie czy wtyczce. Lista plików bywa pierwszym krokiem rozpoznania: podpowiada, czego szukać dalej i które adresy sprawdzić.
MITRE wskazuje, że ujawnienie zawartości katalogu może dać atakującemu dostęp do kodu źródłowego albo informacji przydatnych do przygotowania ataku, takich jak czas utworzenia plików czy dane zakodowane w ich nazwach [1]. Skutek dotyczy poufności, więc listowanie należy do kategorii ujawnienia informacji.
Sekurak zwraca uwagę na katalogi z plikami przesyłanymi przez użytkowników: jeśli w katalogu nie ma pliku index, każdy może zobaczyć wszystkie wgrane pliki [6]. Nazwę takiego katalogu atakujący może odgadnąć albo odczytać z ruchu HTTP aplikacji [6].
Najgroźniejsze są pliki, których serwer nie wykona jako skryptu, tylko wyśle jako tekst. Kopia wp-config.php z innym rozszerzeniem odsłania dane uwierzytelniające do bazy. Mechanizm ten zadziałał w przypadku opisanym poniżej.
Jak się bronić
MITRE zaleca ograniczenie dostępu do ważnych katalogów i plików według zasady wiedzy koniecznej oraz wyłączenie funkcji takich jak automatyczne listowanie katalogów [1]. Sekurak radzi dodatkowo przenieść pliki poza katalog publiczny serwera i udostępniać je przez pośredniczący mechanizm aplikacji [6].
W praktyce dla strony WordPress oznacza to:
- wyłączenie listowania w konfiguracji serwera, a nie tylko przez pliki
index.php, które chronią pojedyncze katalogi; - nietrzymanie kopii zapasowych, zrzutów bazy i starych wersji plików w katalogu strony;
- ograniczenie wykonywania skryptów tam, gdzie trafiają pliki od użytkowników, czyli blokadę wykonywania PHP w katalogu uploads;
- okresowe sprawdzanie adresów katalogów w ramach skanowania podatności.
Wyłączone listowanie nie chroni pliku, którego adres ktoś zna lub odgadnie. Ukrywanie zamiast usuwania to security through obscurity, więc pliki wrażliwe powinny z katalogu publicznego po prostu zniknąć. Wszystkie te kroki są częścią utwardzania serwera, a pozostawione włączone listowanie jest przykładem, który opisuje hasło błędna konfiguracja zabezpieczeń.
Historia i przykłady
Niebezpiecznik opisał w sierpniu 2017 roku przypadek serwisu fundacji zajmującej się poszukiwaniem osób zaginionych [7]. Osoba zgłaszająca problem wycięła z błędnego adresu nazwę pliku i trafiła na listing katalogu [7]. Wśród plików była kopia skryptu PHP z datą w rozszerzeniu, którą serwer wyświetlał jako zwykły tekst [7]. Kod zawierał dane dostępowe do bazy danych serwisu, czyli zaszyte w kodzie hasło [7]. Według artykułu fundacja została powiadomiona przed publikacją i poprawiła zabezpieczenia [7].
Przypisy
7- [1] CWE-548: Exposure of Information Through Directory Listing · MITRE
- [2] Apache Module mod_autoindex · Apache Software Foundation
- [3] Module ngx_http_autoindex_module · nginx
- [4] Apache HTTPD / .htaccess — Advanced Administration Handbook · WordPress.org
- [5] wp-content/index.php (repozytorium WordPress) · WordPress (GitHub)
- [6] Jak zwiększyć bezpieczeństwo swojej webaplikacji? · Sekurak
- [7] Od błędnego linku do przejęcia kontroli nad bazą danych Fundacji Itaka · Niebezpiecznik