Ein sauberer Dateiscan ist keine saubere Website. Eingeschleuste Skripte wohnen bequem im Inhalt: im Text eines Beitrags, in einem Widget, in einer Einstellungszeile, in einer Theme-Option. Die Anwendung neu zu installieren ersetzt die Dateien und lässt jedes einzelne davon genau dort, wo es war.
Suchen Sie danach
SELECT * FROM wp_posts
WHERE post_content LIKE '%<script%'
OR post_content LIKE '%eval(%'
OR post_content LIKE '%base64_decode%'
LIMIT 50;
SELECT option_name, LEFT(option_value, 120) FROM wp_options
WHERE option_value LIKE '%<script%' LIMIT 50;
Dasselbe gilt für jedes Schema: die Textspalten, die Besucher sehen, plus die Einstellungstabelle. Eine Suche nach einem Script-Tag in Inhalt, der niemals eines enthalten dürfte, findet das meiste.
Oder durchsuchen Sie gleich den ganzen Dump
Schneller als bei Tabellen zu raten, und es funktioniert auch bei einem Schema, das Sie nicht kennen.
mysqldump -u user -p dbname > /tmp/scan.sql
grep -n -E '<script|eval\(|base64_decode|document\.write' /tmp/scan.sql | head -40
shred -u /tmp/scan.sql
Bereinigen
- Sichern Sie zuerst die Datenbank — Sie sind im Begriff, UPDATE-Anweisungen auf lebende Inhalte loszulassen.
- Eine Zeile von Hand reparieren — Bestätigen Sie die genaue Zeichenkette und dass ihr Entfernen gültigen Inhalt zurücklässt.
- Dann der Rest, eng eingegrenzt —
UPDATE wp_posts SET post_content = REPLACE(post_content, '<script src="//bad.example"></script>', '') WHERE post_content LIKE '%bad.example%'; - Zählen Sie vorher und nachher — Ein REPLACE, das mehr Zeilen anfasst, als Ihr SELECT gefunden hat, heißt: das Muster ist zu weit gefasst.
Dann die Tür schließen
Inhalt wird durch irgendetwas eingeschleust: ein altes Plugin, ein gestohlenes Admin-Passwort, ein beschreibbarer Upload-Ordner. Die Zeilen zu säubern, ohne das zu finden, heißt: in wenigen Tagen ist es wieder da. Siehe Eine übernommene Website säubern.
