Jak działa ta kontrola
Scanaris żąda dziewięciu nazw plików, których ludzie wciąż używają do przechowywania kopii zapasowych w roocie strony: backup.zip, backup.tar.gz, website.zip, www.zip, public_html.zip, site.zip, database.sql, dump.sql i db.sql. Dla każdego sprawdza, czy odpowiedź to prawdziwy plik, a nie ogólna strona Twojej witryny: patrzy na typ zawartości, a przy zrzutach SQL na to, czy tekst wygląda jak SQL. Wszystkie ustalenia mają wagę krytyczną, bo taki plik zawiera albo pełny kod strony, albo całą bazę danych.
Dlaczego to ważne
Dostępny backup.zip to Twój kompletny projekt: kod, konfiguracja, klucze, które walały się po plikach, i często kopia bazy w środku. dump.sql to baza taka, jaka jest: użytkownicy, e-maile, zahaszowane hasła (do łamania na spokojnie), zamówienia, wiadomości. Żadna technika nie jest potrzebna: to pobranie pliku. A automatyczne skanery próbują dokładnie tych nazw na każdej domenie, którą znajdą, więc „nikt nie zna adresu" nie jest ochroną.
Dlaczego tak się dzieje
Z wygody w złym momencie: przed migracją lub aktualizacją kompresuje się katalog strony „na wszelki wypadek" i zostawia tam. Albo wtyczka do kopii zapasowych zapisuje do publicznego katalogu. Albo eksport bazy zapisuje się obok kodu, żeby komuś go przekazać. Na serwerze serwującym root projektu każdy plik, który tam trafi, jest natychmiast publiczny.
Jak to naprawić
- Usuń plik teraz i działaj tak, jakby został pobrany: zrotuj wszystkie klucze i hasła, które zawierał, a jeśli były w nim dane osobowe, oceń obowiązek zgłoszenia.
- Przenieś kopie zapasowe poza katalog publiczny. Kopie trafiają do osobnego magazynu (prywatny bucket, inny serwer), nigdy do katalogu serwowanego przez serwer WWW.
- Skonfiguruj narzędzie do kopii, żeby zapisywało poza webrootem. Wtyczki WordPressa zwykle pozwalają wybrać katalog albo wysyłać do zewnętrznej usługi.
- Zablokuj rozszerzenia po stronie serwera jako drugą barierę. W nginx:
location ~* \.(zip|tar|gz|sql|bak)$ { deny all; }. W Apache równoważnyFilesMatchzRequire all denied. Jeśli legalnie oferujesz pobieranie skompresowanych plików, ogranicz je do konkretnego katalogu. - Sprawdź logi dostępu pod kątem żądań z kodem 200 do tych nazw: powiedzą Ci, czy ktoś już tam był.
Sprawdź, czy naprawione
for p in backup.zip backup.tar.gz website.zip www.zip public_html.zip site.zip database.sql dump.sql db.sql; do
printf "%-18s " "$p"; curl -s -o /dev/null -w "%{http_code} %{content_type}\n" "https://twojadomena.pl/$p"
done
Oczekiwane: 404 lub 403. 200 z text/html w aplikacji jednostronicowej to jej ogólny HTML; 200 z application/zip, application/octet-stream lub text/plain to prawdziwy plik.
Często zadawane pytania
Moja kopia ma nazwę, której nikt by nie zgadł.
Narzędzia atakujących próbują tysięcy nazw i kombinacji z domeną, datą i słowami jak „old" czy „bak". Nietypowa nazwa zmniejsza ryzyko, ale go nie eliminuje; rozwiązaniem jest, żeby pliku nie było w publicznym katalogu.
A jeśli plik jest chroniony hasłem?
ZIP z hasłem pobiera się tak samo i łamie bez limitu prób na komputerze atakującego. To nadal ustalenie krytyczne.
Kontrola patrzy tylko na root. A podkatalogi?
Zgadza się, te dziewięć nazw testowanych jest w roocie. Otwarte listingi katalogów, które mierzy inna kontrola, to zwykły sposób znajdowania kopii w podkatalogach; zamknięcie ich i zablokowanie rozszerzeń pokrywa resztę.