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

Ekspozycja .htaccess.bak

ważność średniamierzonysposób exposure

Kopia .htaccess wystawiona publicznie. Ujawnia reguły WAF, ścieżki wewnętrzne i lokalizację .htpasswd — mapę zabezpieczeń serwera.

Do 2026-09-16 katalog obiecywał tę ścieżkę przy plikach wrażliwych, ale żadna sonda jej nie próbowała.

ARK. 1

WIKI

artykuł z 16.09.2026 · źródeł 10

Ekspozycja .htaccess.bak to parametr monitoringu stron internetowych, który sprawdza, czy pod adresem /.htaccess.bak serwer WWW oddaje treść kopii pliku konfiguracyjnego .htaccess, zamiast odmówić dostępu albo zgłosić brak pliku. Pomiar kończy się jednym z trzech wyników: kopia dostępna, niedostępna albo nie udało się uzyskać odpowiedzi. Pliki .htaccess to rozproszone pliki konfiguracyjne serwera Apache: umieszczone w katalogu dokumentów zmieniają konfigurację tego katalogu i wszystkich jego podkatalogów [1].

Jak działa

Nazwę pliku konfiguracyjnego wyznacza dyrektywa AccessFileName, domyślnie .htaccess [2]. O tym, które dyrektywy z pliku serwer uwzględni, decydują AllowOverride i AllowOverrideList [1]. Dokumentacja Apache zaleca umieszczanie konfiguracji w pliku głównym, a .htaccess przewiduje dla sytuacji, w których twórcy treści muszą zmieniać konfigurację bez uprawnień administratora, typowych dla hostingu z panelem [1]. WordPress używa .htaccess do sterowania tym, jak Apache podaje pliki z katalogu głównego, zwłaszcza do przyjaznych odnośników; podstawowy blok zaczyna się od # BEGIN WordPress i zawiera dyrektywy RewriteEngine i RewriteRule [8].

Kopia z dodatkowym rozszerzeniem nie jest dla serwera plikiem konfiguracyjnym, tylko zwykłym plikiem w katalogu dokumentów. OWASP opisuje, że ręczne kopie typu file.bak lub file.old są obsługiwane inaczej niż oryginał i zwykle podawane jako tekst [9].

Domyślny plik konfiguracyjny Apache zawiera jednak blok <Files ".ht*"> z dyrektywą Require all denied, opisany jako ochrona plików .htaccess i .htpasswd przed odczytem przez klientów [3]. W sekcji <Files> gwiazdka oznacza dowolny ciąg znaków [2], więc wzorzec obejmuje także .htaccess.bak. Debian stosuje w tym miejscu wyrażenie regularne <FilesMatch "^\.ht"> z tym samym opisem [4]. Wyrażenie nie ma kotwicy końca, więc również pasuje do kopii. Apache z konfiguracją domyślną odmawia zatem dostępu do .htaccess.bak, a wyciek wymaga innego serwera albo zmienionej konfiguracji.

RYS. 1.1Ta sama kopia, dwa serwery

Nginx. Nginx nie ma plików konfiguracyjnych na poziomie katalogu, takich jak .htaccess; całą konfigurację ustawia administrator na poziomie serwera [6]. Poradnik WordPressa dla nginx zaleca osobny blok location ~ /\. z deny all, który blokuje pliki ukryte, m.in. .htaccess, .htpasswd i .DS_Store [6]. Strona przeniesiona z Apache bez takiego bloku zostawia kopię w katalogu, którego żadna reguła nie chroni.

Zbyt wąska reguła. Przykład ochrony plików wrażliwych w dokumentacji WordPressa używa wzorca ^(wp-config\.php|\.htaccess|\.htpasswd|debug\.log)$ [8]. Kotwica końca sprawia, że wzorzec nie obejmuje .htaccess.bak. Kopia pozostaje chroniona tylko wtedy, gdy w konfiguracji głównej działa ogólna reguła dla .ht* [3].

Inna nazwa kopii. Plik skopiowany jako htaccess.bak albo htaccess.txt, bez kropki na początku, nie pasuje do wzorca .ht* [2] [3].

Standardy i specyfikacje

  • Apache HTTP Server, samouczek .htaccess wymienia dwa powody, by woleć plik główny: wydajność i bezpieczeństwo [1].
  • Apache Core Features definiuje AccessFileName, AllowOverride i składnię wzorców w <Files> [2].
  • OWASP WSTG-CONF-04 zalicza kopie i pliki bez odnośników pozostawione w katalogach serwera do źródeł wycieku informacji i zauważa, że stare kopie mogą zawierać błędy poprawione w nowszych wersjach [9].
  • CWE-530 („Exposure of Backup File to an Unauthorized Control Sphere”) to kopia zapasowa zapisana w katalogu lub archiwum dostępnym dla nieuprawnionych; MITRE opisuje kopie przemianowane np. na rozszerzenie .~bk [10].

Zagrożenia i skutki

Ścieżka do pliku haseł. Plik .htaccess może włączać uwierzytelnianie; przykład w dokumentacji Apache zawiera AuthType Basic i ścieżkę AuthUserFile do pliku haseł [1]. Dokumentacja WordPressa podaje taki blok do ochrony wp-login.php, z pełną ścieżką bezwzględną do .htpasswd [8]. Moduł mod_authn_file wymaga, by plik haseł leżał poza drzewem dokumentów, bo inaczej klient może go pobrać [5]. Kopia pokazuje, gdzie ten plik leży.

Zapora aplikacji i ścieżki serwera. Wordfence ładuje swoją zaporę przed WordPressem przez dyrektywę php_value auto_prepend_file w .htaccess, z bezwzględną ścieżką do pliku wordfence-waf.php [7]. Kopia ujawnia więc obecność zapory, położenie jej pliku i układ katalogów na dysku.

Wyjątki dostępu. Dokumentacja WordPressa pokazuje ograniczanie dostępu do wybranych adresów IP dyrektywami Require ip w bloku <RequireAny> [8]. Odczytana kopia wskazuje, z których adresów zabezpieczenie jest pomijane.

RYS. 1.2Od kopii .htaccess do mapy zabezpieczeń

Nieaktualne reguły. Kopia sprzed zmiany pokazuje stan konfiguracji, który mógł zostać poprawiony. OWASP zwraca uwagę, że stara wersja pliku może zawierać błędy usunięte w nowej [9].

Przykłady

SytuacjaOdpowiedź na GET /.htaccess.bakZnaczenie
Apache z domyślnym blokiem <Files ".ht*"> [3]403kopia chroniona tą samą regułą co .htaccess
Apache w Debianie z <FilesMatch "^\.ht"> [4]403wyrażenie obejmuje kopię
Tylko reguła z kotwicą końca dla \.htaccess [8]200 z dyrektywamireguła nie obejmuje kopii
nginx bez bloku dla plików ukrytych [6]200 z dyrektywaminginx nie traktuje pliku jako konfiguracji
nginx z location ~ /\. i deny all [6]403plik istnieje, ale nie jest podawany
Kopia nazwana htaccess.bak, bez kropki [2]zależy od serwerapoza wzorcem .ht*
Kopia z AuthUserFile i ścieżką w katalogu dokumentów [5]200 z dyrektywamiplik haseł do pobrania pod znanym adresem
TAB. 1.1Przypisy10
  1. [1] Apache HTTP Server Tutorial: .htaccess files · Apache Software Foundation
  2. [2] Apache Core Features — AccessFileName, AllowOverride, Files · Apache Software Foundation
  3. [3] httpd.conf.in — domyślna konfiguracja Apache HTTP Server · Apache Software Foundation
  4. [4] apache2.conf.in — konfiguracja pakietu apache2 w Debianie · Debian Apache Maintainers
  5. [5] Apache Module mod_authn_file · Apache Software Foundation
  6. [6] Nginx — Advanced Administration Handbook · WordPress.org
  7. [7] Enable WordFence — OpenLiteSpeed Documentation · OpenLiteSpeed
  8. [8] Apache HTTPD / .htaccess — Advanced Administration Handbook · WordPress.org
  9. [9] WSTG-CONF-04 — Review Old Backup and Unreferenced Files for Sensitive Information · OWASP Web Security Testing Guide
  10. [10] CWE-530: Exposure of Backup File to an Unauthorized Control Sphere · 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.3Ustalenia

Ten parametr nie otworzył jeszcze żadnego ustalenia w bazie LAB247. Pusto nie znaczy „czysto” — znaczy, że nic nie przekroczyło reguły.

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 .htaccess.bak
TAB. 3.1Pomiarpliki: 5
Obszar i ważnośćBezpieczeństwo · średnia (B22)
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).
  2. GET https://domena/.htaccess.bak bez podążania za przekierowaniami; oceniane pierwsze 5000 znaków.
  3. Plik odrzucony, gdy zaczyna się od html, doctype, head albo body.
  4. Reguła: kod 200 i choć jeden marker dyrektyw Apache: rewriteengine, rewriterule, ifmodule, order allow,deny, require all denied, authuserfile, php_value, errordocument.
Typ wyniku0 albo 1 ustalenie exposure_htaccess_bak
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. Reguła: 200 + początek nie jest HTML-em + marker dyrektywy.
Gdzie leżą pokrętłaCREATO_PING/helpers/exposure_check.py → PROBES (reguła htaccess_text), _HTACCESS_MARKERS, _HTML_MARKERS, _text_file_matchesCREATO_PING/helpers/config.py → TIMEOUTS["exposure"], TIMEOUTS["security_connect"]CREATO_PING/helpers/security_runner.py → _TASK_SEVERITIESCREATO_PING/config/incident_policy.toml → [finding] exposure_htaccess_bak
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. Na Apache z domyślną regułą dla plików .ht* kopia .htaccess.bak dostaje 403 niezależnie od tego, czy istnieje — sonda może trafić tylko na nginx, innym serwerze albo przy zmienionej konfiguracji.
  2. Sprawdzana jest jedna nazwa; .htaccess.old, .orig, kopia z tyldą oraz htaccess.bak bez kropki (poza regułą .ht*) nie są sondowane.
  3. Lista markerów jest wąska: kopia z samym Options -Indexes, Deny from all, Header albo Require ip nie daje ustalenia.
  4. Dowód nie mówi, co wyciekło — ta sama waga dla kopii z samym przepisywaniem adresów i dla kopii ze ścieżką do pliku haseł.
  5. alert w polityce nie jest czytany, brak trzeciego stanu 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 · odczyt 16.09.2026
TAB. 3.2Co oznacza failtypów ustaleń: 1

Powaga wysoka w helperze i w polityce, pewność ewidentna, skutek PODATNA — subtask z priorytetem wysokim, status strony przeliczony na PODATNA.

UstaleniePowagaPewnośćSkutekSubtask / alarmCo zrobić
Kopia .htaccess.bakexposure_htaccess_bakWysokieEwidentnePODATNAtak / nieUsuń plik z serwera.
ARK. 4

LOOP

pętli: 3
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ętle3 · zmian: 4 · 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 plików wrażliwych, 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 plików wrażliwych, Ekspozycja .env, 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
HTML dyskwalifikuje zrzut bazy tylko na początku plikuzamknięta historyczna 2026-09-16

Sygnał: Przegląd kodu nowych sond przed wdrożeniem: reguła odrzucała plik, gdy HTML pojawił się gdziekolwiek w pierwszych 5000 znaków, a prawdziwy zrzut bazy WordPressa ma znaczniki HTML w treści wpisów — pilny wyciek zostałby przeoczony. · dotyczy też: Ekspozycja zrzutu bazy

  1. 1. Zbiórkabrakreguła poprawiona przed pierwszym przebiegiem
  2. 2. Werdyktręcznieprzegląd kodu: zrzut WordPressa zawiera HTML w treści wpisów
  3. 3. Miarabrakliczników trafności wtedy nie było
  4. 4. Kartabrakkarta parametru powstała 2026-09-16
  5. 5. Zmianazrobionerozstrzyga początek pliku
  6. 6. Replaybrakpo wdrożeniu suchy przebieg na żywo, bez zapisanych odczytów
DataZmianaPowódWpływ na systemCommit · replay
2026-09-16Plik uznany za stronę HTML tylko wtedy, gdy zaczyna się od <html, <!doctype, <head albo <body; dotyczy zrzutów .sql i kopii .htaccess.bak.helpers/exposure_check.pyStrona błędu zaczyna się od HTML-a, a zrzut bazy od komentarza albo CREATE; szukanie HTML-a w całej treści dawało fałszywy negatyw na ustaleniu pilnym.tylko ten parametr193591fbez 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