Dostępność readme.html
ważność średniamierzonysposób exposure
Czy /readme.html ujawnia wersję WP. Łatwy cel rekonesansu.
WIKI
artykuł z 16.09.2026 · źródeł 6Dostępność readme.html to parametr monitoringu stron internetowych, który sprawdza, czy pod adresem /readme.html w katalogu głównym witryny serwer oddaje plik z opisem WordPressa, dołączany do paczki instalacyjnej. Pomiar kończy się jednym z trzech wyników: plik dostępny, plik niedostępny albo nie udało się uzyskać odpowiedzi. Plik trafia na serwer razem z całą paczką, bo instrukcja instalacji każe rozpakować ją w pustym katalogu i wgrać wszystko [1].
Jak działa
Obecny readme.html to statyczna strona z tytułem „WordPress › ReadMe”, logo projektu i instrukcją obejmującą instalację, aktualizację automatyczną i ręczną, migrację z innych systemów, wymagania systemowe, zasoby online i licencję GPL [1]. Wymagania podają minimalne wersje PHP 7.4 i MySQL 5.5.5 oraz zalecane PHP 8.3 i MySQL 8.0 albo MariaDB 10.11 [1]. Numeru wersji samego WordPressa w pliku nie ma [1].
Do grudnia 2016 roku nagłówek pliku zawierał wiersz z numerem wersji, a test jednostkowy pilnował jego zgodności z wersją rdzenia. Commit z 12 grudnia 2016 roku, w gałęzi rozwojowej wersji 4.8, usunął oba [2]. Pozostałe sposoby odczytu wersji rdzenia z zewnątrz opisuje artykuł Wersja WordPressa.
Rozpoznanie pliku jest proste: kod 200 i słowo „WordPress” w treści. Tak działa moduł skanera WPScan, który uznaje plik za znaleziony, gdy odpowiedź ma kod 200, a treść pasuje do wyrażenia /wordpress/i [4]. Oprócz readme.html WPScan próbuje nazw olvasdel.html, lisenssi.html i liesmich.html [4].
Standardy i specyfikacje
- OWASP WSTG-INFO-08 („Fingerprint Web Application Framework”) opisuje rozpoznawanie aplikacji po znanych plikach i katalogach. Technika nazywana forced browsing polega na odpytywaniu serwera o znane nazwy plików i folderów oraz obserwowaniu kodów odpowiedzi [3]. Przewodnik pokazuje ją na WordPressie, rozpoznawanym po odpowiedziach dla
/wp-includes/,/wp-admin/i/wp-content/, oraz na plikureadme.txtwtyczki, który w poluStable tagpodaje jej dokładną wersję [3]. - CWE-200 wymienia wśród informacji wrażliwych stan i środowisko systemu, np. system operacyjny i zainstalowane pakiety [6].
- Hardening WordPress nazywa bezpieczeństwo przez ukrywanie (ang. security through obscurity) strategią zasadniczo nietrafioną jako podstawowa, choć wskazuje miejsca, gdzie ukrycie informacji może pomóc: nazwę konta administratora i prefiks tabel bazy [5].
Zagrożenia i skutki
Potwierdzenie platformy. Według OWASP znajomość komponentów aplikacji znacznie skraca test, a narzędzia automatyczne szukają znaczników w przewidywalnych miejscach i porównują je z bazą sygnatur [3]. Dostępny readme.html jest takim znacznikiem: potwierdza WordPressa jednym żądaniem, choć w wydaniach od 4.8 nie podaje numeru wersji [2].
Mała wartość ukrycia. OWASP ocenia zmiany nazw plików i katalogów oraz usuwanie znanych nagłówków jako ukrywanie, które spowalnia tylko najmniej zaawansowanych napastników; czas lepiej poświęcić na świadomość interesariuszy i utrzymanie rozwiązań [3]. WordPress da się rozpoznać także po jego katalogach [3], więc usunięcie jednego pliku nie ukrywa platformy. Usunięcie ma sens jako porządek, a nie jako zabezpieczenie.
Przykłady
| Sytuacja | Odpowiedź na GET /readme.html | Znaczenie |
|---|---|---|
| Instalacja z paczki, plik nieusunięty [1] | 200, strona „WordPress › ReadMe” | platforma potwierdzona, bez numeru wersji |
| Plik z wydania sprzed zmiany z 2016 roku [2] | 200, w nagłówku może być wiersz z wersją | numer wersji możliwy do odczytu wprost |
| Plik usunięty albo zablokowany | 404 albo 403 | brak tego znacznika, katalogi WordPressa nadal widoczne [3] |
| Plik pod inną nazwą z listy WPScan [4] | 404 pod /readme.html | sonda jednej ścieżki go nie zauważy |
| Strona innego systemu pod tym adresem [4] | 200 bez słowa „WordPress” | reguła nie jest spełniona |
- [1] readme.html (wordpress-develop, trunk) · WordPress Core
- [2] Remove the WordPress version number from readme.html (commit 9e70bab, trunk@39583) · WordPress Core
- [3] WSTG-INFO-08 — Fingerprint Web Application Framework · OWASP Web Security Testing Guide
- [4] WPScan — moduł wyszukiwania readme.html (readme.rb) · WPScan Team
- [5] Hardening WordPress — Security through obscurity · WordPress Developer Resources
- [6] CWE-200: Exposure of Sensitive Information to an Unauthorized Actor · MITRE
STATS
wyniki z systemu · tylko liczby zbiorczeTen 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.
Ten parametr nie otworzył jeszcze żadnego ustalenia w bazie LAB247. Pusto nie znaczy „czysto” — znaczy, że nic nie przekroczyło reguły.
- Przebiegów
- 33sposób exposure
- W 30 dni
- 0przebiegów
- Ostatni
- 19.09.2026start przebiegu
- Stron w przebiegach
- —33 przebiegów bez liczby stron
CARD
karta z kodu CREATO_PING, odczyt 22.09.2026Jak ten parametr trafia do ClickUpa: wynik sondy to linia w subtasku 2. Pomiar, a usterka, którą otwiera — linia w subtasku 1. Podsumowanie (z identyfikatorem CWE i kategorią OWASP), skąd liczy się wskaźnik zagrożenia i status strony. Projekcja z bazy skanera odświeża oba subtaski co godzinę. Do 22.09 każde ustalenie dostawało własny subtask i status ze starego słownika (PODATNA, WARNING…) — te słowa zostały jeszcze w części opisów pomiaru niżej jako język wewnętrzny sond.
| Obszar i ważność | Bezpieczeństwo · średnia (B16) |
|---|---|
| Workflow i częstotliwość | creato_ping_security_v2 · P3 działa na LAB247Skaner 2.0, rytm „p3” / „bezpieczenstwo”: premium co 6 h, reszta co 24 h (tier 1–3), co 9 dni (tier 4) · Dokładny skan. dns_integrity porównuje NS, MX, SPF i DMARC z wzorcem z poprzedniego przebiegu. |
| Sonda i helper | sposób exposure · CREATO_PING/helpers/exposure_check.py |
| Testy |
|
| Typ wyniku | 0 albo 1 ustalenie exposure_readme (powaga niska) — dziś odrzucane przed zapisem |
| Jednostka | brak — wynik jakościowy |
| Próg i reguła | Timeout odpowiedzi 15 s, połączenia 5 s. Reguła: kod 200 + słowo WordPress w pierwszych 5000 znakach. |
| Gdzie leżą pokrętła | CREATO_PING/helpers/exposure_check.py → PROBES (/readme.html, reguła 200+contains:WordPress)CREATO_PING/helpers/config.py → TIMEOUTS["exposure"], TIMEOUTS["security_connect"]CREATO_PING/helpers/security_runner.py → do_writera (bramka gate z polityki; sito powagi zniknęło 18.09)CREATO_PING/config/incident_policy.toml → [finding] exposure_readme |
| Retencja odczytów | Surowy pomiar jako NIEZMIENNY wiersz tabeli `odczyty` w bazie skanera (wejście, wyjście, dowody, sha karty sondy i helpera, commit kodu) — trigger odrzuca każdą zmianę. Okno retencji z kohorty: 90 dni premium, 30 dni reszta; poza oknem zostają odczyty z werdyktem problemu, akcją albo etykietą, bo replay reguł ich potrzebuje (`skaner/retencja.py`). Do LAB247 ten kanał nie idzie (do bazy serwisu jadą dziś tylko sprawdzenia dostępności), więc poza odczytem zostaje werdykt w tabeli `werdykty` i sprawa w tabeli `sprawy`. |
| Znane rozbieżności |
|
| Karta przepisana z | CREATO_PING/helpers/exposure_check.py · CREATO_PING/helpers/security_runner.py · CREATO_PING/config/incident_policy.toml · CREATO_PING/skaner/klasyfikacja.py · CREATO_PING/skaner/usterki.toml · CREATO_PING/skaner/ocena.py · odczyt 22.09.2026 |
exposure_readme: bramka polityki zamknięta (gate=false) — zostaje odczyt i werdykt „bez_subtaska” w bazie skanera, sprawa nie powstaje, więc usterka „readme.html ujawnia wersję WordPressa” (waga 1) nie wchodzi do wskaźnika strony.
| Kod | Finding | Severity | Pewność | Skutek | Finding / alarm | Waga → ocena | Co zrobić |
|---|---|---|---|---|---|---|---|
| B16.01 | Dostępny readme.htmlexposure_readme | Niska | Ewidentne | bez wpływu | nie / nie | waga 1 → ocena 2 (zielony) | Usuń readme.html po każdej aktualizacji. |
| Kod i klucz | B16.01 · exposure_readme · w tabeli typów |
|---|---|
| Co znaczy | Plik ujawnia wersję WordPressa — drobny rekonesans. |
| Kiedy powstaje | GET /readme.html: status == 200, a pierwsze 5000 znaków zawiera 'WordPress' (bez rozróżniania wielkości liter).Ocena :242-246. gate=false — odpada w security_runner.py:289 (liczy się tylko do severity_counts). |
| Severity · pewność | Niska · Ewidentne |
| Skutek dla strony | bez wpływu · tylko statystyka (gate=false) · alarm nie |
| Waga → ocena | waga 1 → ocena 2 (zielony) |
| Klasyfikacja | CWE: CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor)OWASP Top 10:2025: A01:2025 Broken Access ControlOWASP ASVS 5.0.0: 13.4.6OCSF 1.9.0: Vulnerability Finding (class_uid 2002) |
| Rekord OCSF | finding_info.analytic.uid = "B16.01" · analytic.name = "exposure_readme" · finding_info.types = ["B16 Dostępność readme.html"] |
| Co zrobić | Usuń readme.html po każdej aktualizacji. |
| Wersje typu |
|
LOOP
pętli: 2Trafnoś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.
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, Kopie wp-config.php, Ekspozycja .htaccess.bak, Dostępność xmlrpc.php, REST API: enumeracja użytkowników, Ekspozycja .git/HEAD, Dostępność wp-cron.php, Ekspozycja kopii zapasowych, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev, Ekspozycja .DS_Store
- 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
- 2. Werdyktręcznieprzegląd skanera: 200 na wszystko i ciche timeouty to fałszywe wyniki
- 3. Miarabrakliczników trafności wtedy nie było
- 4. Kartabrakkarta parametru powstała 2026-09-16
- 5. Zmianazrobionestrażnik ścieżki, 15 s, logowanie błędów
- 6. Replaybrakbrak zapisanych odczytów do replayu
| Data | Zmiana | Powód | Wpływ na system | Commit · replay |
|---|---|---|---|---|
| 2026-09-05 | Przed 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.toml | Odpowiedź 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-05 | Limit 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.py | Wolne 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 |
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, Kopie wp-config.php, Ekspozycja .env, Ekspozycja .htaccess.bak, Dostępność xmlrpc.php, REST API: enumeracja użytkowników, Ekspozycja .git/HEAD, Dostępność wp-cron.php, Ekspozycja kopii zapasowych, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev, Ekspozycja .DS_Store
- 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
- 2. Werdyktręcznieawaria procesu przypisana ścieżce debug.log
- 3. Miarabrakliczników trafności wtedy nie było
- 4. Kartabrakkarta parametru powstała 2026-09-16
- 5. Zmianazrobionestrumień z limitem 64 KB
- 6. Replaybrakbrak zapisanych odczytów do replayu
| Data | Zmiana | Powód | Wpływ na system | Commit · replay |
|---|---|---|---|---|
| 2026-07-19 | Odpowiedź sondy czytana strumieniem do 64 KB; do oceny idzie pierwsze 5000 znaków.helpers/exposure_check.py · helpers/html_fetch.py · helpers/sitemap_check.py | Do 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 |