ARK. B09Parametr monitoringuBezpieczeństwo · lista 50 parametrów

Ekspozycja plików wrażliwych

ważność wysokamierzonysposób exposure

Dostępność wp-config.php.bak, wp-config.php~, debug.log, listingu katalogów. Częsty błąd przy migracji hostingu.

ARK. 1

WIKI

artykuł z 16.09.2026 · źródeł 10

Ekspozycja plików wrażliwych to parametr monitoringu stron internetowych, który sprawdza, czy serwer WWW oddaje publicznie pliki pozostawione obok kodu strony: kopie pliku konfiguracyjnego wp-config.php z innym rozszerzeniem (wp-config.php.bak, wp-config.php~), dziennik błędów wp-content/debug.log oraz automatycznie wygenerowany spis zawartości katalogu. Pomiar kończy się jednym z trzech wyników: plik lub spis dostępny, niedostępny albo nie udało się uzyskać odpowiedzi. Przewodnik testowania OWASP zalicza stare kopie, pliki nieużywane i logi pozostawione w katalogach serwera do typowych źródeł wycieku informacji [1].

Jak działa

Kopie powstają na dwa sposoby. Część tworzą narzędzia: OWASP podaje przykład edytora emacs, który przy edycji pliku file zapisuje kopię file~ [1], a Vim trzyma zmiany w pliku wymiany o nazwie edytowanego pliku z rozszerzeniem .swp, na systemach uniksowych poprzedzonej kropką, w tym samym katalogu [5]. Resztę tworzą ludzie. MITRE opisuje kopie przemianowane automatycznie albo ręcznie przez administratora, np. na rozszerzenie .~bk, i pozostawione w katalogu dokumentów serwera [2]. Taki sam charakter ma kopia wp-config.php.bak zrobiona przed edycją lub przeniesieniem strony.

Plik wp-config.php leży w katalogu głównym instalacji WordPressa i zawiera dane połączenia z bazą (DB_NAME, DB_USER, DB_PASSWORD, DB_HOST) oraz unikalne klucze i sole uwierzytelniania [3]. Przy żądaniu tego pliku serwer przekazuje go interpreterowi PHP i odsyła wynik wykonania, a nie kod. Decyduje o tym dopasowanie nazwy: zalecana w dokumentacji PHP konfiguracja Apache kieruje do interpretera tylko pliki pasujące do wyrażenia \.php$ [4]. Nazwa wp-config.php.bak kończy się na .bak, więc wyrażenie jej nie obejmuje i serwer podaje plik jak każdy inny plik statyczny. OWASP opisuje ten sam mechanizm: żądanie viewdoc.bak może zwrócić kod źródłowy viewdoc.jsp [1].

RYS. 1.1Plik PHP i jego kopia

Dziennik błędów powstaje z ustawienia. Stała WP_DEBUG_LOG zapisuje wszystkie błędy do pliku debug.log, domyślnie w katalogu treści, zwykle wp-content/debug.log; można też podać inną ścieżkę [6]. Działa tylko przy włączonym WP_DEBUG [6]. Dokumentacja zaleca łączenie jej z WP_DEBUG_DISPLAY ustawionym na false, żeby błędy nie trafiały do HTML strony, lecz dało się je przejrzeć później [6].

Spis katalogu to funkcja serwera. W Apache opcja Indexes sprawia, że gdy adres wskazuje katalog bez pliku z listy DirectoryIndex, moduł mod_autoindex zwraca sformatowaną listę jego zawartości [7]. Domyślny plik konfiguracyjny Apache ustawia dla katalogu dokumentów Options Indexes FollowSymLinks [8]. W nginx spis tworzy moduł autoindex dla żądań zakończonych ukośnikiem, zwykle wtedy, gdy nie ma pliku indeksu; dyrektywa autoindex jest domyślnie wyłączona [9].

Standardy i specyfikacje

  • OWASP WSTG-CONF-04 każe sprawdzać kopie plików i pliki bez odnośników, a spis katalogu nazywa najbardziej oczywistym sposobem, w jaki źle skonfigurowany serwer ujawnia takie pliki [1]. Zauważa też, że logi mogą zawierać identyfikatory sesji, parametry adresów i adresy nieujawnionych stron [1].
  • CWE-530 („Exposure of Backup File to an Unauthorized Control Sphere”) to kopia zapasowa zapisana w katalogu lub archiwum dostępnym dla nieuprawnionych; jest potomkiem CWE-552, plików i katalogów dostępnych dla stron zewnętrznych [2]. Wśród obserwowanych przypadków MITRE wymienia wtyczkę WordPressa tworzącą przewidywalne nazwy kopii (CVE-2024-7315) [2].
  • CWE-548 („Exposure of Information Through Directory Listing”) to udostępnienie spisu wszystkich zasobów katalogu; MITRE zaleca wyłączenie automatycznych spisów katalogów [10].

Zagrożenia i skutki

Dane dostępowe do bazy. Odczytana kopia wp-config.php daje nazwę bazy, użytkownika, hasło i adres serwera bazy oraz klucze i sole [3]. Kod źródłowy pobrany z kopii pozwala też szukać podatności, których nie widać przy żądaniach do wykonywanej strony [1].

RYS. 1.2Od kopii pliku do bazy danych

Treść dziennika. Log może ujawniać działania użytkowników, identyfikatory sesji i adresy, które nie są nigdzie podlinkowane [1]. Stała WP_DEBUG_LOG zapisuje wszystkie błędy, więc plik rośnie z każdym zapisanym błędem, dopóki ustawienie jest włączone [6].

Spis katalogu. MITRE wskazuje, że spis może dać dostęp do kodu źródłowego, ujawnić daty utworzenia plików i informacje zawarte w nazwach, przydatne przy planowaniu ataku [10]. Spis ujawnia też pliki, do których nie prowadzi żaden odnośnik, w tym kopie opisane wyżej [1].

Fałszywe trafienia. Odpowiedź 200 z własną stroną „nie znaleziono” wygląda w samym kodzie statusu jak istniejący plik [1]. O wycieku rozstrzyga treść odpowiedzi, a nie sam kod.

Przykłady

SytuacjaOdpowiedź serweraZnaczenie
GET /wp-config.php przy dopasowaniu \.php$ [4]wynik wykonania skryptukod i hasła niewidoczne
Kopia wp-config.php.bak w katalogu instalacji [2] [4]200 z tekstem plikudane bazy, klucze i sole do zmiany [3]
Kopia emacs wp-config.php~ [1]200 z tekstem plikujak wyżej
Plik wymiany Vim .wp-config.php.swp [5]zależy od reguł dla nazw z kropkązawiera zmiany z sesji edycji
WP_DEBUG i WP_DEBUG_LOG włączone, bez własnej ścieżki [6]200 z wierszami błędów pod wp-content/debug.logścieżki, sesje, adresy [1]
Apache z Options Indexes, katalog bez pliku indeksu [7] [8]200 ze spisem plikówCWE-548 [10]
nginx z ustawieniami domyślnymi [9]brak spisuautoindex off
TAB. 1.1Przypisy10
  1. [1] WSTG-CONF-04 — Review Old Backup and Unreferenced Files for Sensitive Information · OWASP Web Security Testing Guide
  2. [2] CWE-530: Exposure of Backup File to an Unauthorized Control Sphere · MITRE
  3. [3] wp-config.php — Advanced Administration Handbook · WordPress.org
  4. [4] Apache 2.x on Unix systems — PHP Manual · The PHP Group
  5. [5] recover.txt — Vim help: swap file · Vim
  6. [6] Debugging in WordPress — Advanced Administration Handbook · WordPress.org
  7. [7] Apache Core Features — dyrektywy Options i DirectoryMatch · Apache Software Foundation
  8. [8] httpd.conf.in — domyślna konfiguracja Apache HTTP Server · Apache Software Foundation
  9. [9] Module ngx_http_autoindex_module · nginx
  10. [10] CWE-548: Exposure of Information Through Directory Listing · MITRE
ARK. 2

STATS

wyniki z systemu · tylko liczby zbiorcze
TAB. 2.1Odczyty per strona

Ten parametr nie zapisuje odczytu per strona — przebieg zostawia tylko ustalenia, więc liczby sprawdzonych stron i wyników „ok” system nie ma. Pojawią się po wdrożeniu zapisu przebiegów per strona per parametr.

TAB. 2.3Ustaleniaod 21.07.2026
Otwarte teraz
3stron: 2
Nowe w ostatnim dniu
109.09.2026
Otwarte od początku
4stron: 3
Zamknięte
1od początku
Mediana trwania
18 dni 19 hod wykrycia do zamknięcia
UstalenieSkutekOtwarte terazŁącznieZamknięte
Kopia wp-config.php.bak exposure_wpconfig_bakPODATNA000
Kopia wp-config.php~ exposure_wpconfig_tildePODATNA000
Publiczny debug.log exposure_debug_logPODATNA341
Listing katalogów exposure_directory_listingPODATNA000
RYS. 2.2Nowe ustalenia, 30 dni
23.08.202607.09.202621.09.2026
Nowe ustalenia parametru Ekspozycja plików wrażliwych, 30 dni · wysokość słupka = liczba ustaleń dnia, warstwy od dołu: nowe ustalenia · dni bez odczytu: 29
Nowe ustalenia parametru Ekspozycja plików wrażliwych, 30 dni
Dzieńnowe ustalenia
23.08.20260 ustaleń
24.08.20260 ustaleń
25.08.20260 ustaleń
26.08.20260 ustaleń
27.08.20260 ustaleń
28.08.20260 ustaleń
29.08.20260 ustaleń
30.08.20260 ustaleń
31.08.20260 ustaleń
01.09.20260 ustaleń
02.09.20260 ustaleń
03.09.20260 ustaleń
04.09.20260 ustaleń
05.09.20260 ustaleń
06.09.20260 ustaleń
07.09.20260 ustaleń
08.09.20260 ustaleń
09.09.20261 ustalenie
10.09.20260 ustaleń
11.09.20260 ustaleń
12.09.20260 ustaleń
13.09.20260 ustaleń
14.09.20260 ustaleń
15.09.20260 ustaleń
16.09.20260 ustaleń
17.09.20260 ustaleń
18.09.20260 ustaleń
19.09.20260 ustaleń
20.09.20260 ustaleń
21.09.20260 ustaleń
TAB. 2.4Przebiegi z tym sposobem sprawdzeniaod 09.09.2026
Przebiegów
33sposób exposure
W 30 dni
33przebiegów
Ostatni
19.09.2026start przebiegu
Stron w przebiegach
33 przebiegów bez liczby stron
ARK. 3

CARD

karta z kodu CREATO_PING, odczyt 16.09.2026
RYS. 3.1Droga parametru przez system: Ekspozycja plików wrażliwych
TAB. 3.1Pomiarpliki: 6
Obszar i ważnośćBezpieczeństwo · wysoka (B09)
Workflow i częstotliwośćcreato_ping_security_v2 · P3 działa na LAB247cron co 24 h, T1–T3; T4 raz po anomalii · Dokładny skan. dns_integrity porównuje NS, MX, SPF i DMARC z wzorcem z poprzedniego przebiegu.
Sonda i helpersposób exposure · CREATO_PING/helpers/exposure_check.py
Testy
  1. Tylko przebieg P3; przed sondami strażnik losowej ścieżki (200 z treścią = sondy pominięte, exposure_scan_unreliable).
  2. Cztery żądania GET bez podążania za przekierowaniami: /wp-config.php.bak, /wp-config.php~, /wp-content/debug.log, /wp-content/uploads/. Treść strumieniem do 64 KB, oceniane pierwsze 5000 znaków.
  3. Kopie wp-config i debug.log: kod 200 i niepusta treść — zawartość nie jest sprawdzana.
  4. Listing: kod 200 i tytuł Index of / albo odnośnik, którego adres zaczyna się od kropki.
Typ wyniku0 do 4 ustaleń, każde osobnym typem: exposure_wpconfig_bak, exposure_wpconfig_tilde, exposure_debug_log, exposure_directory_listing; do zapisu docierają najwyżej 3 (listing odpada w filtrze przebiegu)
Jednostkabrak — wynik jakościowy; w dowodzie ścieżka, kod HTTP i długość treści, bez samej treści pliku
Próg i regułaTimeout odpowiedzi 15 s, połączenia 5 s. 403, 404, przekierowanie, błąd sieci i timeout = brak ustalenia.
Gdzie leżą pokrętłaCREATO_PING/helpers/exposure_check.py → PROBES, _INDEX_OF, _HREF_PARENT, _soft_200CREATO_PING/helpers/config.py → TIMEOUTS["exposure"], TIMEOUTS["security_connect"]CREATO_PING/helpers/security_runner.py → _TASK_SEVERITIESCREATO_PING/config/incident_policy.toml → [finding] exposure_wpconfig_bak, exposure_wpconfig_tilde, exposure_debug_log, exposure_directory_listing
Retencja odczytówOdczytu per strona nie zapisujemy — zostaje tylko ustalenie w tabeli findings (otwarcie, zamknięcie, dowód). Replay po surowych odczytach dziś niemożliwy.
Znane rozbieżności
  1. Listing katalogu nigdy nie trafia do zapisu: helper nadaje mu powagę normalną, filtr przebiegu przepuszcza tylko pilną i wysoką. Polityka (wysoka, gate=true) obiecuje subtask, którego nie ma.
  2. Reguła listingu uznaje za spis każdą stronę z odnośnikiem zaczynającym się od kropki (np. ./style.css) — po naprawie powagi pojawią się fałszywe trafienia.
  3. Kopie wp-config i debug.log: kod 200 ze stroną HTML daje ustalenie; zawartość (stałe DB_, wiersze logu) nie jest sprawdzana.
  4. Sprawdzane są tylko dwie nazwy kopii; wp-config.php.old, .save, .orig, plik wymiany .swp i debug.log pod własną ścieżką nie są sondowane. Listing tylko w /wp-content/uploads/.
  5. alert=true w polityce nie jest czytane ani przez kod, ani przez n8n — PODATNA nie wysyła powiadomienia.
  6. Brak trzeciego stanu, brak śledzenia przekierowań i brak sygnału zamknięcia — wspólne dla sond ekspozycji.
kandydaci do pętli: kod a opis parametru albo specyfikacja
Karta przepisana zCREATO_PING/helpers/exposure_check.py · CREATO_PING/helpers/config.py · CREATO_PING/config/incident_policy.toml · CREATO_PING/helpers/security_runner.py · CREATO_PING/helpers/clickup_writer_v2.py · CREATO_PING/workflows/_prod/creato_ping_security_v2.json · odczyt 16.09.2026
TAB. 3.2Co oznacza failtypów ustaleń: 4

Kopie wp-config.php: powaga pilna, skutek PODATNA, subtask z priorytetem pilnym. debug.log: helper daje pilną (przechodzi filtr), polityka nadpisuje na wysoką — subtask wysoki, status PODATNA. Listing: helper daje normalną, więc filtr przebiegu odrzuca ustalenie przed zapisem i subtask nie powstaje. Helper nie wysyła sygnału zamknięcia.

UstaleniePowagaPewnośćSkutekSubtask / alarmCo zrobić
Kopia wp-config.php.bakexposure_wpconfig_bakPilneEwidentnePODATNAtak / takUsuń plik z serwera, zmień hasło do bazy.
Kopia wp-config.php~exposure_wpconfig_tildePilneEwidentnePODATNAtak / takUsuń plik z serwera, zmień hasło do bazy.
Publiczny debug.logexposure_debug_logWysokieEwidentnePODATNAtak / nieWyłącz WP_DEBUG_LOG na produkcji i usuń plik.
Listing katalogówexposure_directory_listingWysokieEwidentnePODATNAtak / nieWyłącz Indexes w .htaccess lub konfiguracji serwera.
ARK. 4

LOOP

pętli: 2
RYS. 4.1Pętla parametru — sześć etapów
TAB. 4.1Trafność, 30 dnialarmy · prawdziwe · fałszywe · bez rozstrzygnięcia

Trafności jeszcze nie liczymy: zamknięcie subtaska nie niesie dziś werdyktu (prawdziwy / fałszywy / nie dało się sprawdzić). Cztery liczby pojawią się, gdy każde zamknięcie dostanie werdykt — to warunek startu pętli 1.

TAB. 4.2Pętle2 · zmian: 3 · wpływających na cały system: 3
Strażnik losowej ścieżki i dłuższy limit czasu dla sond ekspozycjizamknięta historyczna 2026-09-05

Sygnał: Tarcze antybotowe hostingu, strony parkingowe i serwery catch-all odpowiadają 200 na każdą ścieżkę, więc sondy oparte na kodzie 200 dawały „wystawiony” wszędzie. Równocześnie sondy na wolnych hostingach odpowiadały po około 15 s, a limit 5 s ucinał je bez śladu. · dotyczy też: Ekspozycja .env, Ekspozycja .htaccess.bak, Dostępność xmlrpc.php, REST API: enumeracja użytkowników, Ekspozycja .git/HEAD, Dostępność readme.html, Dostępność wp-cron.php, Ekspozycja kopii zapasowych, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev, Ekspozycja .DS_Store

  1. 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
  2. 2. Werdyktręcznieprzegląd skanera: 200 na wszystko i ciche timeouty to fałszywe wyniki
  3. 3. Miarabrakliczników trafności wtedy nie było
  4. 4. Kartabrakkarta parametru powstała 2026-09-16
  5. 5. Zmianazrobionestrażnik ścieżki, 15 s, logowanie błędów
  6. 6. Replaybrakbrak zapisanych odczytów do replayu
DataZmianaPowódWpływ na systemCommit · replay
2026-09-05Przed sondami GET losowej, nieistniejącej ścieżki; odpowiedź 200 z treścią = zero sond i jedno ustalenie exposure_scan_unreliable (niska powaga, bez subtaska).helpers/exposure_check.py · config/incident_policy.tomlOdpowiedź 200 na losową ścieżkę dowodzi, że kod 200 na tym serwerze nic nie znaczy; dalsze sondowanie tarczy grozi banem IP monitoringu.cały system Obejmuje wszystkie sondy ekspozycji naraz i wprowadza typ „nie dało się sprawdzić”; tę samą konwencję dostało wykrywanie wtyczek. Ustalenie ma niską powagę, więc filtr przebiegu je odrzuca i w produkcji nie zostawia śladu.b0fc77cbez replayubez zapisu zatwierdzenia
2026-09-05Limit odpowiedzi z 5 s na 15 s i połączenia z 2 s na 5 s, przeniesione do config.py; błąd sieci sondy logowany zamiast cichego pustego wyniku; do 4 sond naraz na stronę.helpers/config.py · helpers/exposure_check.py · helpers/html_fetch.py · helpers/wp_fingerprint.pyWolne hostingi odpowiadały po około 15 s, a pusty wynik po timeoucie był nieodróżnialny od „sprawdzone, czysto”.cały system Limit połączenia 5 s przejęło wspólne pobieranie HTML całego skanu bezpieczeństwa i wykrywanie wersji — strony z wolnym TLS przestały wypadać z całego skanu.b0fc77cbez replayubez zapisu zatwierdzenia
Limit 64 KB czytanej odpowiedzi po awarii pamięcizamknięta historyczna 2026-07-19

Sygnał: Brak pamięci podczas skanu: publiczny debug.log jednej ze stron był bardzo duży, a klient HTTP buforował całą odpowiedź. · dotyczy też: Sitemap.xml, Ekspozycja .env, Ekspozycja .htaccess.bak, Dostępność xmlrpc.php, REST API: enumeracja użytkowników, Ekspozycja .git/HEAD, Dostępność readme.html, Dostępność wp-cron.php, Ekspozycja kopii zapasowych, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev, Ekspozycja .DS_Store

  1. 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
  2. 2. Werdyktręcznieawaria procesu przypisana ścieżce debug.log
  3. 3. Miarabrakliczników trafności wtedy nie było
  4. 4. Kartabrakkarta parametru powstała 2026-09-16
  5. 5. Zmianazrobionestrumień z limitem 64 KB
  6. 6. Replaybrakbrak zapisanych odczytów do replayu
DataZmianaPowódWpływ na systemCommit · replay
2026-07-19Odpowiedź sondy czytana strumieniem do 64 KB; do oceny idzie pierwsze 5000 znaków.helpers/exposure_check.py · helpers/html_fetch.py · helpers/sitemap_check.pyDo rozpoznania ekspozycji wystarcza początek pliku; zmiana dotyczy sposobu czytania, nie werdyktu.cały system Brak pamięci w helperze zatrzymywał cały proces skanu bezpieczeństwa partii stron; ten sam limit dostało sprawdzenie sitemap.343b699bez replayubez zapisu zatwierdzenia
Blog 24/7
20.09Zastrzeżony PESEL: zmiana raz na 30 minut, blokada przy wypłaciedobreprogramy.pl20.09Fałszywe SMS-y od GITD o mandacie za autostradę wyłudzają dane kartyinstalki.pl20.09Pakiet npm indexed-btree omija blokadę skryptów instalacyjnychbleepingcomputer.com19.09SolarWinds łata CVE-2026-28326 w Access Rights Manager, zdalny kod bez logowaniathehackernews.com19.09Orkes Conductor: luka CVE-2026-58138 atakowana w sieci, poprawka w wersji 3.30.2thehackernews.com19.09Trzy luki jądra Linux w katalogu CISA KEV, Red Hat potwierdza aktywne atakithehackernews.com18.09Publiczne exploity na cztery luki jądra Linux dają lokalnie uprawnienia rootthehackernews.com18.09Brevo: skradziony klucz API Cloudflare i skrypty ClickFix na stronach klientówbleepingcomputer.com18.09WaterPlum z Korei Północnej zainfekowała 30 000 urządzeń w 100 krajachtherecord.media18.09Jedna zgoda OAuth daje napastnikowi dostęp do poczty i plików mimo MFAdarkreading.com