Kopia zapasowa wp-config.php jest publicznie dostępna
Co to jest
W katalogu webroot Twojego WordPressa jest publicznie dostępny plik taki jak wp-config.php.bak, wp-config.php.old, wp-config.txt lub wp-config.php~. Powstaje to najczęściej tak:
- Edytowałeś
wp-config.phpw edytorze tekstu, a ten zrobił automatyczną kopię zapasową (wp-config.php~). - Przed zmianą „zabezpieczałeś” stare wersje poprzez zmianę nazwy (
cp wp-config.php wp-config.php.bak). - Hosting lub wtyczka zrobiły automatyczną kopię zapasową i zapisały ją obok.
Dlaczego to problem
Kluczowa różnica względem zwykłego wp-config.php: pliki PHP Apache/nginx wykonuje — zwraca wynik HTML, a nie kod. Ale plik z rozszerzeniem .bak lub .txt serwer wysyła jako czysty tekst. Atakujący otwiera https://example.cz/wp-config.php.bak i dostaje:
DB_NAME,DB_USER,DB_PASSWORD,DB_HOST— dostęp do bazy danych.AUTH_KEY,SECURE_AUTH_KEY,LOGGED_IN_KEY,NONCE_KEY— klucze szyfrujące dla cookies sesji.table_prefix— konkretne nazwy tabel.
Mając klucze, atakujący podpisuje sobie cookies administratora. Mając bazę danych, opróżnia jej zawartość i ustawia hasło. Zwykle jest po wszystkim.
Jak to naprawić
Krok 1 — usunąć wszystkie kopie .bak / .old / .txt
cd /var/www/example.cz
ls -la wp-config*
# znajdź i usuń
rm wp-config.php.bak wp-config.php.old wp-config.php~ wp-config.txtPrzejrzyj też cały webroot:
find . -type f \( -name "*.bak" -o -name "*.old" -o -name "*~" \) -lsKrok 2 — zmienić to, co było w pliku .bak
Załóż, że ktoś ten plik pobrał. Wymień:
- Hasło do bazy danych. Po zmianie zaktualizuj też
wp-config.php:define('DB_PASSWORD', 'noweHaslo');. - Klucze bezpieczeństwa WordPressa (
AUTH_KEYitd.). Nowe wygeneruj na api.wordpress.org/secret-key/1.1/salt/ i podmień. Ta zmiana wyloguje wszystkich aktywnych użytkowników — to w porządku.
Krok 3 — zablokować wzorce .bak / .old na serwerze WWW
Aby kolejna omyłkowo utworzona kopia nie wydostała się na zewnątrz:
nginx:
location ~* \.(bak|old|backup|orig|swp|save|~)$ {
deny all;
return 404;
}Apache (.htaccess):
<FilesMatch "\.(bak|old|backup|orig|swp|save|~)$">
Require all denied
</FilesMatch>Krok 4 — robić kopie zapasowe poprawnie
Kopię wp-config.php należy trzymać poza webroot, w systemie wersjonowania (prywatny git, bucket S3 z SSE, dedykowany hosting kopii zapasowych). Nigdy obok aktywnej wersji.