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:

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:

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

Przejrzyj też cały webroot:

find . -type f \( -name "*.bak" -o -name "*.old" -o -name "*~" \) -ls

Krok 2 — zmienić to, co było w pliku .bak

Załóż, że ktoś ten plik pobrał. Wymień:

  1. Hasło do bazy danych. Po zmianie zaktualizuj też wp-config.php: define('DB_PASSWORD', 'noweHaslo');.
  2. Klucze bezpieczeństwa WordPressa (AUTH_KEY itd.). 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.

Źródła