Blog 24/7
ARK. B28Parametr monitoringuBezpieczeństwo · lista 87 parametrów

Ekspozycja zrzutu bazy

ważność krytycznamierzonysposób exposure

Pliki backup.sql, dump.sql i database.sql. Hasła użytkowników, dane osobowe, klucze — najgorszy możliwy wyciek.

Rozstrzygają słowa kluczowe SQL przy braku HTML na początku pliku.

ARK. 1

WIKI

artykuł z 16.09.2026 · źródeł 10

Ekspozycja zrzutu bazy to parametr monitoringu stron internetowych, który sprawdza, czy pod przewidywalnymi adresami w katalogu głównym witryny, takimi jak /backup.sql, /dump.sql i /database.sql, serwer oddaje tekstowy zrzut bazy danych. Pomiar kończy się jednym z trzech wyników: zrzut dostępny publicznie, zrzut niedostępny albo nie udało się uzyskać odpowiedzi. Zrzut jest kopią zapasową, więc jego publiczne udostępnienie mieści się w słabości CWE-530: plik kopii przechowywany w miejscu dostępnym dla nieuprawnionych podmiotów [10].

Jak działa

Program mysqldump wykonuje kopie logiczne: tworzy zestaw instrukcji SQL, które po wykonaniu odtwarzają definicje obiektów bazy i dane tabel [1]. Służy do kopii zapasowych i do przenoszenia baz na inny serwer SQL [1]. Domyślny wynik zawiera instrukcje CREATE TABLE, które odtwarzają każdą tabelę, oraz instrukcje INSERT z danymi [1]. Opcja --add-drop-table, włączona domyślnie, dopisuje DROP TABLE przed każdym CREATE TABLE [1], a --add-locks otacza zrzut tabeli instrukcjami LOCK TABLES i UNLOCK TABLES [1]. Włączona domyślnie opcja --comments dopisuje na początku pliku komentarze z wersją programu, wersją serwera i nazwą hosta [1]. Opcja --compact wyłącza między innymi komentarze i instrukcje DROP TABLE [1].

Taki plik jest zwykłym tekstem. Gdy leży w katalogu, z którego serwer WWW podaje pliki, jest kopią zapasową dostępną dla każdego, kto zna jej adres [10].

Po kodzie 200 zrzutu nie da się rozpoznać, bo pod dowolnym adresem może stać strona błędu. Rozpoznanie opiera się na dwóch cechach treści. Strona błędu zaczyna się od znaczników HTML, np. <!doctype html>, a zrzut od komentarza albo instrukcji SQL. W dalszej części zrzutu występują słowa kluczowe instrukcji wymienionych w dokumentacji: CREATE TABLE, INSERT, DROP TABLE, LOCK TABLES [1]. Znaczniki HTML w środku pliku nie przesądzają, bo tabela wp_posts przechowuje wpisy i strony witryny [2], a ich treść zawiera kod HTML.

RYS. 1.1Rozpoznanie zrzutu po treści

Pierwsza odpowiedź to strona HTML z kodem 200, więc nie jest zrzutem. Druga oznacza brak pliku. Trzecia zaczyna się komentarzem i zawiera instrukcję CREATE TABLE, czyli ma cechy zrzutu.

Standardy i specyfikacje

  • Dokumentacja mysqldump (MySQL 8.4) opisuje format zrzutu: instrukcje SQL, domyślne komentarze nagłówkowe i opcje dopisujące DROP TABLE oraz LOCK TABLES [1].
  • Baza WordPressa. Każda tabela ma ten sam prefiks zdefiniowany w wp-config.php, domyślnie wp_ [2]. Tabela wp_users przechowuje informacje o użytkownikach witryny, po jednym wierszu na użytkownika [2], a wp_options ustawienia witryny [2]. Tabela wp_comments zawiera komentarze do wpisów i stron [2]. Wśród danych użytkownika są login, adres e-mail i nazwa wyświetlana [3].
  • Hasła w wp_users. Funkcja wp_set_password zapisuje do kolumny user_pass tabeli użytkowników skrót hasła, nie samo hasło [4]. Od wersji 6.8 WordPress zamiast przenośnego skrótu phpass używa bcrypt, co znacznie zwiększa koszt łamania skrótów [5]. Nowe skróty mają prefiks $wp$2y$, a stare są przeliczane na bcrypt przy najbliższym logowaniu albo zmianie hasła [5].
  • CWE-530 w opisie skutków stwierdza, że kto pobierze plik kopii, ma wszystkie zapisane w nim informacje [10].
  • RODO. Według UODO zgłoszenie naruszenia do organu nadzorczego na podstawie art. 33 ust. 1 RODO powinno nastąpić nie później niż 72 godziny od jego stwierdzenia [8]. Rządowy serwis Biznes.gov.pl zalicza do naruszeń nieuprawnione ujawnienie danych osobowych i nieuprawniony dostęp do nich [9].

Zagrożenia i skutki

Łamanie skrótów offline. OWASP wymaga, żeby hasła były chronione także wtedy, gdy baza danych zostanie przejęta [6]. Atakujący, który ma skróty, sprawdza dla nich długą listę kandydatów na hasło [6]. Przy szybkim sprzęcie i chmurze koszt takiego łamania jest stosunkowo niski [6]. Silne hasła zapisane nowoczesnym algorytmem powinny być w praktyce niemożliwe do złamania [6], więc najbardziej narażone są hasła słabe i skróty w starym formacie, jeszcze nieprzeliczone na bcrypt [5].

Kradzież kont poza witryną. Pary login i hasło z wycieku jednej witryny służą do ataku credential stuffing, czyli sprawdzania ich w innych serwisach [7].

RYS. 1.2Od zrzutu do zgłoszenia

Obowiązek zgłoszenia. Publicznie dostępny zrzut z danymi użytkowników może oznaczać nieuprawnione ujawnienie danych osobowych albo nieuprawniony dostęp do nich [9]. Termin 72 godzin liczy się od stwierdzenia naruszenia [8]. Administrator nie musi zgłaszać naruszenia, jeśli po jego odkryciu oceni ryzyko dla praw i wolności osób jako małe [9]. Gdy ryzyko jest wysokie, trzeba też zawiadomić osoby, których dane dotyczą, zgodnie z art. 34 RODO [8].

Przykłady

SytuacjaCo zobaczy sondaZnaczenie
Zrzut mysqldump z domyślnymi opcjami [1]200, komentarze z wersją serwera, potem DROP TABLE i CREATE TABLEzrzut dostępny publicznie
Zrzut z opcją --compact [1]200, bez komentarzy, od razu instrukcje SQLzrzut dostępny publicznie
Strona błędu podawana z kodem 200200, treść od <!doctype html>brak zrzutu
Zrzut z treścią wpisów zawierającą HTML [2]znaczniki HTML w środku pliku, początek od komentarza SQLnadal zrzut
Baza sprzed WordPressa 6.8 bez ponownych logowań [5]skróty phpass w user_passskróty łatwiejsze do złamania
Zrzut z danymi klientów sklepu lub autorów komentarzy [9]adresy e-mail i dane osobowe w INSERTocena ryzyka i ewentualne zgłoszenie w 72 h [8]
TAB. 1.1Przypisy10
  1. [1] mysqldump — A Database Backup Program (MySQL 8.4 Reference Manual) · Oracle / MySQL
  2. [2] The WordPress Database · Learn WordPress
  3. [3] wp_insert_user() — Function Reference · WordPress.org
  4. [4] wp_set_password() — Function Reference · WordPress.org
  5. [5] WordPress 6.8 will use bcrypt for password hashing · Make WordPress Core
  6. [6] Password Storage Cheat Sheet · OWASP
  7. [7] Credential Stuffing Prevention Cheat Sheet · OWASP
  8. [8] Naruszenia ochrony danych osobowych należy zgłaszać Prezesowi UODO bez zbędnej zwłoki · Urząd Ochrony Danych Osobowych
  9. [9] Zgłoś naruszenie ochrony danych osobowych · Biznes.gov.pl
  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
0przebiegów
Ostatni
19.09.2026start przebiegu
Stron w przebiegach
—33 przebiegów bez liczby stron
ARK. 3

CARD

karta z kodu CREATO_PING, odczyt 22.09.2026

Jak 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.

RYS. 3.1Droga parametru przez system: Ekspozycja zrzutu bazy
TAB. 3.1Pomiarpliki: 7
Obszar i ważnośćBezpieczeństwo · krytyczna (B28)
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 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/backup.sql, /dump.sql i /database.sql bez podążania za przekierowaniami; oceniane pierwsze 5000 znaków tekstu małymi literami.
  3. Krok 1: kod 200 i treść NIE zaczyna się od html, doctype, head ani body — znaczniki HTML dalej w pliku nie dyskwalifikują.
  4. Krok 2: co najmniej jeden z 6 markerów: create table, insert into, drop table if exists, mysqldump, -- server version, lock tables.
Typ wyniku0 albo 1 ustalenie exposure_sql_dump (trzy ścieżki sklejone w jedno)
Jednostkabrak — wynik jakościowy; w dowodzie ścieżka i długość ocenianej treści, bez samej treści pliku
Próg i regułaTimeout odpowiedzi 15 s, połączenia 5 s. Reguła: kod 200 + początek nie jest HTML-em + marker SQL w pierwszych 5000 znakach.
Gdzie leżą pokrętłaCREATO_PING/helpers/exposure_check.py → PROBES (reguła sql_dump), _SQL_MARKERS, _HTML_MARKERS, _text_file_matches, _soft_200CREATO_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_sql_dump
Retencja odczytówSurowy 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
  1. Dowolna odpowiedź tekstowa z kodem 200, która nie zaczyna się od HTML-a i zawiera frazę insert into (zwykły tekst, JSON z błędem), daje ustalenie pilne.
  2. Zrzut skompresowany gzipem pod adresem .sql nie daje ustalenia, a nazwy .sql.gz, db.sql ani nazwa bazy nie są sondowane.
  3. Katalog mówi o „hasłach użytkowników” — baza WordPressa trzyma skróty haseł (phpass, od 6.8 bcrypt), nie hasła.
  4. alert=true w polityce nie jest czytane, 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/tests/test_exposure_check.py · CREATO_PING/skaner/usterki.toml · CREATO_PING/skaner/ocena.py · odczyt 22.09.2026
TAB. 3.2Co oznacza failtypów Findingów: 1

exposure_sql_dump: bramka polityki otwarta (gate=true) → sprawa w skanerze → Zrzut bazy danych do pobrania — waga 3 → ocena 5–6 (żółty), status strony „sredni”, dopóki sprawa jest otwarta. Kolejne przebiegi odświeżają opis i datę; helper nie wysyła sygnału zamknięcia.

KodFindingSeverityPewnośćSkutekFinding / alarmWaga → ocenaCo zrobić
B28.01Publiczny zrzut bazyexposure_sql_dumpKrytycznaEwidentneotwarta podatnośćtak / takwaga 3 → ocena 5–6 (żółty)Usuń zrzut, zmień hasło do bazy i wszystkie ujawnione sekrety; rozważ zgłoszenie naruszenia.
TAB. 3.3B28.01 · Publiczny zrzut bazywersja 1 · 01.10.2026
Kod i kluczB28.01 · exposure_sql_dump · w tabeli typów
Co znaczyPlik .sql z bazą jest dostępny publicznie — hasła użytkowników, dane osobowe i klucze.
Kiedy powstajeGET /backup.sql, /dump.sql, /database.sql: status == 200. Pierwsze 5000 znaków (lower, lstrip) NIE może zaczynać się od '<html', '<!doctype', '<head' ani '<body' i musi zawierać któryś marker: 'create table', 'insert into', 'drop table if exists', 'mysqldump', '-- server version', 'lock tables'.Markery :166-169, :175, ocena :193-194, :250-264. Dedup do jednego findingu na domenę. Dowód tylko skrót.
Severity · pewnośćKrytyczna · Ewidentne
Skutek dla stronyotwarta podatność · zakłada Finding · alarm tak
Waga → ocenawaga 3 → ocena 5–6 (żółty)
KlasyfikacjaCWE: CWE-530 (Exposure of Backup File to an Unauthorized Control Sphere)OWASP Top 10:2025: A01:2025 Broken Access ControlMITRE ATT&CK 19.2: T1552.001 Unsecured Credentials: Credentials In Files (warunek)OWASP ASVS 5.0.0: 13.4.7OCSF 1.9.0: Vulnerability Finding (class_uid 2002)
Rekord OCSFfinding_info.analytic.uid = "B28.01" · analytic.name = "exposure_sql_dump" · finding_info.types = ["B28 Ekspozycja zrzutu bazy"]
Co zrobićUsuń zrzut, zmień hasło do bazy i wszystkie ujawnione sekrety; rozważ zgłoszenie naruszenia.
Wersje typu
  1. v1 · 01.10.2026 — kod B28.01 nadany (finding-codes.ts)
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, Kopie wp-config.php, 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 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, Kopie wp-config.php, 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 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 .htaccess.bak

  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
05.11CISA i FBI wzywają do zabezpieczenia sterowników chłodzenia po atakach w Europietherecord.media05.11Midnight Blizzard atakowała iPhone'y i Androidy przez zainfekowane strony w Europie i USAsecurityweek.com05.11APT29 kradła dane z iPhone'ów i Androidów przez przejęte i podrobione stronytherecord.media05.11Grupa APT29 przejęła skrypt Plerdy i atakowała niezałatane iPhone'y i Androidythehackernews.com05.11Microsoft wykrył 7,3 mld wiadomości phishingowych w III kwartale 2026microsoft.com05.11DigiCert ujawnia wyciek danych klientów i skanów dokumentów tożsamościbleepingcomputer.com05.11CWPdoor podmienia serwer cwpsrv w Control Web Panel i otwiera tylne wejście do Linuksableepingcomputer.com05.11Brytyjskie NCSC ostrzega, że narzędzia AI zwiększyły liczbę wykrywanych luk zero-daythehackernews.com05.11Skaner RootEvidence sprawdza starą lukę w Cisco IOS i dodaje nagłówki Opt-Outisc.sans.edu05.11Włamanie do portalu grantowego Norad, zagrożone dane 20 614 użytkownikówhelpnetsecurity.com