Woran du erkennst, dass WordPress gehackt wurde

Nicht jede kaputte Website ist gehackt. Ein weißer Bildschirm nach einem Plugin-Update, ein abgelaufenes SSL-Zertifikat oder eine überlastete Datenbank fühlen sich ähnlich bedrohlich an, haben aber harmlose Ursachen. Ein Hack ist es dann, wenn jemand ohne deine Erlaubnis etwas verändert hat.

Eindeutige Anzeichen:

  • Dein Hoster meldet Schadcode, hat Dateien gesperrt oder das ganze Paket deaktiviert.
  • Google zeigt in den Suchergebnissen „Diese Website wurde möglicherweise gehackt“, oder Browser warnen vor dem Aufruf.
  • In Benutzer steht ein Administrator, den niemand angelegt hat.
  • Besucher landen auf Glücksspiel-, Pharma- oder Fake-Shop-Seiten.
  • Deine E-Mails kommen plötzlich nicht mehr an, weil die Server-IP auf einer Spam-Blacklist steht.

Zwei Varianten übersiehst du als Betreiber leicht, weil sie sich gezielt vor dir verstecken. Bei bedingten Weiterleitungen werden nur Besucher umgeleitet, die über Google kommen oder ein Smartphone nutzen. Wer die Adresse direkt eintippt und eingeloggt ist, sieht die normale Website. Beim sogenannten Keyword-Hack bekommt nur der Googlebot Spam-Seiten ausgeliefert, oft mit japanischen Schriftzeichen oder Markennamen. Gib bei Google site:deinedomain.de ein: Tauchen dort Seiten auf, die du nie angelegt hast, ist das ein starkes Indiz. In der Google Search Console zeigt die URL-Prüfung, was Google tatsächlich abruft.

Eine gehackte Website, drei verschiedene Ergebnisse

Du tippst die Adresse direkt ein

  1. Browser
  2. deinedomain.de
  3. Normale Startseite

Ein Besucher kommt über die Google-Suche

  1. Google-Suche
  2. deinedomain.de
  3. Weiterleitung
  4. Fake-Shop

Der Googlebot ruft die Seite ab

  1. Googlebot
  2. deinedomain.de
  3. Spam-Seiten im Index

Die erste Stunde: Schaden begrenzen

Der Reflex ist, sofort zu löschen und aufzuräumen. Das zerstört aber genau die Spuren, die du später brauchst, um die Lücke zu finden. Geh deshalb in dieser Reihenfolge vor:

  1. Aufschreiben, was du siehst. Uhrzeit, Symptom, betroffene Adressen, Screenshots. Notiere auch, was in den letzten Wochen geändert wurde, etwa ein neues Plugin oder ein Theme-Wechsel. Das WordPress-Projekt nennt diesen Schritt in seiner Notfall-FAQ ausdrücklich als ersten.
  2. Hoster kontaktieren. Frag nach der Liste der gefundenen Dateien, nach den Zugriffsprotokollen (Access-Logs) der letzten Wochen und danach, wie weit die Backups zurückreichen. Bei Shared Hosting kann der Befall auch andere Installationen im selben Paket betreffen.
  3. Den infizierten Zustand sichern. Eine vollständige Kopie von Dateien und Datenbank, getrennt abgelegt und klar beschriftet. Damit spielst du nichts zurück, aber sie dient als Beweis und als Vergleichsbasis.
  4. Website vom Netz nehmen. Ein Wartungsmodus-Plugin reicht nicht, weil der Schadcode trotzdem weiterläuft. Besser: Der Hoster sperrt den Zugriff, oder du leitest per .htaccess alle Besucher außer deiner eigenen IP auf eine statische Hinweisseite.
  5. Den eigenen Rechner prüfen. Gestohlene FTP- oder Admin-Zugangsdaten stammen oft von einem befallenen Arbeitsplatz. Ein vollständiger Virenscan gehört deshalb vor jede Passwortänderung.
  6. Alle Zugänge neu setzen. WordPress-Konten (vor allem Administratoren), FTP/SFTP, SSH, Datenbank, Hosting-Kundenkonto und das E-Mail-Postfach, über das Passwort-Resets laufen.

Nach der Bereinigung änderst du die Passwörter ein zweites Mal. Solange noch eine Hintertür offen ist, kann der Angreifer die neuen Zugangsdaten mitlesen.

Backup einspielen: nur mit dem richtigen Stand

Ein Backup ist der schnellste Weg zurück, aber nur, wenn es aus der Zeit vor dem Einbruch stammt. Viele Hacks bleiben wochenlang unbemerkt, weil die Angreifer die Website zunächst nur als Spam-Schleuder nutzen. Hoster-Backups bei Shared Hosting reichen dagegen oft nur wenige Wochen zurück. Frag deinen Anbieter nach dem genauen Zeitraum.

Beispielrechnung

Reicht dein Backup weit genug zurück?

Jeder Balken ist eine tägliche Sicherung der letzten 60 Tage. Verschieb die Regler und sieh, ob noch ein Stand von vor dem Einbruch übrig ist.

Kein sauberes Backup: Alle 14 vorhandenen Sicherungen stammen aus der Zeit nach dem Einbruch.

Selbst ein sauberes Backup löst nur die Hälfte des Problems. Es stellt die Website wieder her, lässt aber das veraltete Plugin oder das gestohlene Passwort, über das der Angreifer hereinkam, unverändert. Wer nur zurückspielt, wird häufig nach wenigen Tagen erneut gehackt.

Wo sich Schadcode in WordPress versteckt

Angreifer legen selten nur eine Datei ab. Meist gibt es eine sichtbare Wirkung, etwa die Weiterleitung, und daneben eine oder mehrere Hintertüren, um nach einer Bereinigung wiederzukommen.

OrtWorauf du achtest
.htaccess (im Hauptverzeichnis und in Unterordnern)Weiterleitungen mit Bedingungen auf Referrer oder User-Agent
wp-content/uploads/PHP-Dateien. Dort gehören nur Bilder und Dokumente hin
wp-content/mu-plugins/„Must-Use“-Plugins laden automatisch und lassen sich im Backend nicht deaktivieren
wp-config.phpFremder Code am Anfang oder Ende, eingebundene Zusatzdateien
functions.php, header.php, footer.php im ThemeEingefügte Skripte und Links
Datenbank, Tabelle wp_optionsGeänderte siteurl und home, unbekannte Einträge mit langem, unlesbarem Inhalt
Datenbank, Tabelle wp_usersKonten, die niemand kennt, auch mit harmlos klingenden Namen wie „wpsupport“
Geplante Aufgaben (WP-Cron)Unbekannte Ereignisse, die den Schadcode regelmäßig neu anlegen

Typisch für eingeschleusten PHP-Code ist eine Kombination aus eval, base64_decode und gzinflate, oft in einer einzigen sehr langen Zeile. Das Änderungsdatum der Dateien hilft nur begrenzt, weil Angreifer es gern auf ein altes Datum zurücksetzen.

Bietet dein Hoster SSH-Zugang und WP-CLI, prüfen diese Befehle die Dateien gegen die Originale von WordPress.org:

SSH · Hauptverzeichnis der WordPress-Installation
wp core verify-checksums            # Core-Dateien geändert oder hinzugefügt?
wp plugin verify-checksums --all    # Plugins aus dem offiziellen Verzeichnis
wp user list --role=administrator   # Wer hat Admin-Rechte?
wp cron event list                  # Welche geplanten Aufgaben laufen?
find wp-content/uploads -name "*.php"   # PHP-Dateien, wo nur Medien liegen sollten

Premium-Plugins und gekaufte Themes kann verify-checksums nicht prüfen, weil WordPress.org dafür keine Prüfsummen hat. Die vergleichst du mit einem frischen Download beim Hersteller.

Sauber neu aufsetzen statt einzelne Dateien flicken

Gefundenen Schadcode Datei für Datei zu entfernen, ist verlockend. In der Praxis bleibt dabei fast immer eine Hintertür übrig, die man nicht kannte. Zuverlässiger ist es, alles Austauschbare aus sauberen Quellen neu einzuspielen und nur die eigenen Inhalte zu übernehmen:

  1. Die Ordner wp-admin und wp-includes vollständig löschen und aus einem frischen Download der gleichen WordPress-Version neu hochladen. Die WordPress-FAQ rät dabei zu FTP statt zur Neuinstallation im Backend, weil diese nur vorhandene Dateien überschreibt und zusätzliche Dateien liegen lässt.
  2. Jedes Plugin und Theme löschen und neu aus dem offiziellen Verzeichnis oder vom Hersteller installieren. Was deaktiviert ist oder nicht mehr gebraucht wird, kommt nicht zurück. „Kostenlose“ Versionen von Premium-Themes aus inoffiziellen Quellen enthalten häufig selbst schon Hintertüren.
  3. In wp-content/uploads/ alle PHP-Dateien entfernen und den Rest stichprobenartig prüfen.
  4. In wp-config.php die Sicherheitsschlüssel neu erzeugen, über den offiziellen Generator. Damit werden alle angemeldeten Sitzungen beendet, auch die des Angreifers.
  5. Unbekannte Benutzer löschen, das Datenbankpasswort ändern und in wp-config.php eintragen.
  6. Danach WordPress, Plugins, Themes und die PHP-Version auf den aktuellen Stand bringen.

Andere Installationen im selben Webspace

Eine vergessene Testinstallation unter /alt/ oder /test/, ein früheres Joomla oder eine Kopie vom letzten Relaunch: Liegen sie im selben Webspace, kann der Angreifer von dort aus jederzeit zurückkommen. Entweder mitbereinigen oder löschen.

Das Einfallstor finden, sonst kommt der Angreifer wieder

Die Bereinigung ist erst abgeschlossen, wenn du weißt oder zumindest stark eingrenzen kannst, wie der Angreifer hereingekommen ist. Die häufigsten Wege bei kleinen Websites:

  • ein Plugin oder Theme mit bekannter, aber nicht eingespielter Sicherheitslücke,
  • ein erratenes oder anderswo gestohlenes Admin-Passwort ohne zweiten Faktor,
  • abgegriffene FTP-Zugangsdaten von einem befallenen Rechner,
  • eine vergessene zweite Installation im selben Webspace.

Hilfreich ist der Abgleich mit den Access-Logs: Such dir den Zeitpunkt der ersten verdächtigen Dateiänderung und schau, welche Anfragen kurz davor kamen. Mehrere POST-Anfragen an eine Plugin-Datei, die normalerweise niemand direkt aufruft, sind ein deutlicher Hinweis. Wie du Core- und PHP-Updates dauerhaft im Blick behältst, steht im Beitrag zu WordPress- und PHP-Sicherheitsupdates.

Google, Besucher und Datenschutz

Hat Google deine Website markiert, findest du die Details in der Search Console im Bericht Sicherheitsprobleme. Erst wenn alles behoben ist, wählst du dort Überprüfung anfordern. Google erwartet laut Hilfeseite zum Bericht eine Beschreibung des Problems, der Gegenmaßnahmen und einen Nachweis, dass sie gewirkt haben. Die Prüfung kann einige Tage bis mehrere Wochen dauern. Wer zu früh einreicht und abgelehnt wird, verlängert die Zeit mit Warnhinweis nur.

Hat der Angreifer Zugriff auf personenbezogene Daten gehabt, etwa gespeicherte Formulareinträge, Kundenkonten oder Kommentare mit E-Mail-Adressen, kommt die Datenschutzseite dazu. Nach Art. 33 DSGVO ist eine solche Verletzung grundsätzlich innerhalb von 72 Stunden der Aufsichtsbehörde zu melden, außer sie führt voraussichtlich nicht zu einem Risiko für die Betroffenen. Ob das bei dir zutrifft, klärst du mit deinem Datenschutzbeauftragten oder einer Anwältin. Dieser Artikel ist keine Rechtsberatung.

72 Stunden

Frist für die Meldung an die Aufsichtsbehörde nach Art. 33 DSGVO, gerechnet ab dem Moment, in dem du von der Verletzung weißt.

3 Angaben

erwartet Google im Antrag auf Überprüfung: das Problem, die Gegenmaßnahmen und den Nachweis, dass sie gewirkt haben.

Selbst bereinigen oder machen lassen?

  • Kleine Info-Website, Backup vor dem Einbruch vorhandenSelbst machen ist realistisch – Mit SSH-Zugang, sauberem Backup und den Schritten oben gut machbar. Rechne mit einem halben bis ganzen Arbeitstag.
  • Kein sauberes Backup, Spam nur für Google sichtbarHilfe holen – Versteckte Hintertüren sind ohne Erfahrung schwer vollständig zu finden. Wer nur einen Teil erwischt, ist oft nach kurzer Zeit wieder befallen.
  • Shop, Mitgliederbereich oder KundendatenProfessionell bereinigen lassen – Hier geht es auch um Datenschutzpflichten und Zahlungsdaten. Dokumentation und Ursachenanalyse sollten belastbar sein.

Wenn du einen Dienstleister beauftragst, frag vorher, ob er nur Schadcode entfernt oder auch das Einfallstor sucht und schriftlich dokumentiert. Nur das zweite verhindert den nächsten Vorfall.

Danach: weniger Angriffsfläche

Nach einem Hack lohnt der ehrliche Blick darauf, wie viel WordPress deine Website wirklich braucht. Jedes Plugin, das nur für eine Kleinigkeit installiert wurde, ist ein Kandidat zum Entfernen. Regelmäßige Updates müssen fest jemandem zugeordnet sein. Was das kostet, rechnet der Artikel zu WordPress-Wartung und Kosten durch.

Bei reinen Informationsseiten, die sich selten ändern, gibt es eine weitergehende Möglichkeit: Die öffentliche Website wird als statisches HTML ausgeliefert, und WordPress läuft, wenn überhaupt, nur noch geschützt im Hintergrund. Dann gibt es am öffentlichen Frontend keinen Login, kein PHP und keine Datenbank mehr, die angegriffen werden können.

WordPress öffentlich erreichbar

7 Teil der Angriffsfläche

  • Login (wp-admin)
  • Plugins
  • Theme
  • WordPress-Core
  • Datenbank
  • PHP
  • Webserver

Statisch ausgeliefert

1 Teil der Angriffsfläche

  • HTML-Dateien und Bilder
  • Webserver
Teil der Angriffsfläche

Wie das funktioniert und wo die Grenzen liegen, steht unter WordPress als Static Site.

Erst bereinigen, dann exportieren

Ein HTML-Export übernimmt, was die Website ausliefert, also auch eingeschleuste Skripte und Spam-Links. Spam, der nur dem Googlebot gezeigt wird, landet dagegen nicht im Export und bleibt im alten System unentdeckt. Exportiere deshalb erst, wenn WordPress nachweislich sauber ist.

Ob deine Website für eine statische Auslieferung infrage kommt, zeigt der Eignungscheck in zwei Minuten.