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
- Cadangkan dulu basis datanya — Anda hendak menjalankan pernyataan UPDATE terhadap isi yang sedang hidup.
- Perbaiki satu baris dengan tangan — pastikan untaian teksnya persis, dan bahwa membuangnya menyisakan isi yang sah.
- 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%'; - Bandingkan jumlahnya sebelum dan sesudah — REPLACE yang menyentuh lebih banyak baris daripada yang ditemukan SELECT Anda berarti polanya terlalu lebar.
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.
