Pemindaian berkas yang bersih bukan berarti situsnya bersih. Skrip yang disusupkan hidup dengan nyaman di dalam isi: tubuh sebuah tulisan, sebuah widget, sebaris setelan, sebuah opsi tema. Memasang ulang aplikasinya hanya mengganti berkas-berkasnya dan meninggalkan semua itu persis di tempatnya semula.

Carilah ia

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;

Gagasan yang sama berlaku bagi skema apa pun: kolom-kolom teks yang dilihat pengunjung, ditambah tabel setelannya. Mencari tag script di dalam isi yang semestinya tak pernah memuatnya akan menemukan sebagian besarnya.

Atau langsung telusuri seluruh cadangannya

Lebih cepat daripada menerka-nerka tabel, dan ia bekerja pada skema yang tak Anda kenal.

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

Bersihkan

  1. Cadangkan dulu basis datanya — Anda hendak menjalankan pernyataan UPDATE terhadap isi yang sedang hidup.
  2. Perbaiki satu baris dengan tangan — pastikan untaian teksnya persis, dan bahwa membuangnya menyisakan isi yang sah.
  3. Lalu sisanya, dengan jangkauan yang sempit — UPDATE wp_posts SET post_content = REPLACE(post_content, '<script src="//bad.example"></script>', '') WHERE post_content LIKE '%bad.example%';
  4. Bandingkan jumlahnya sebelum dan sesudah — REPLACE yang menyentuh lebih banyak baris daripada yang ditemukan SELECT Anda berarti polanya terlalu lebar.
Jangan sekali-kali menjalankan REPLACE yang lebar pada semua kolom teks sekaligus. Itu cara tercepat mengubah sebuah pembobolan menjadi kehilangan data, dan cadangan yang Anda ambil dua menit lalu pun menjadi satu-satunya salinan isi Anda.

Lalu tutup pintunya

Isi itu disusupkan lewat sesuatu: pengaya yang tua, kata sandi administrator yang dicuri, map unggahan yang bisa ditulisi. Membersihkan barisnya tanpa menemukan itu berarti ia kembali dalam hitungan hari. Lihat Membersihkan situs yang sudah dibobol.