Bali, Indonesia
Insights

Kenapa Malware Website Muncul Lagi Padahal File Sudah Dihapus

October 18, 2026
0:00
Banyak pengelola website mengira masalah selesai begitu file mencurigakan yang dilaporkan scanner dihapus dari File Manager. Selang beberapa jam atau keesokan harinya, file dengan nama acak serupa muncul kembali di direktori yang sama, atau situs kembali diarahkan ke domain spam. Situasi ini sering disalahartikan sebagai serangan baru yang terus-menerus masuk, padahal sebagian besar kasus adalah infeksi lama yang belum pernah benar-benar bersih. Di meja bantuan hosting, pola reinfeksi seperti ini adalah keluhan harian. Masalah utamanya sederhana: menghapus file payload (file yang menjalankan aksi jahat) tidak sama dengan menghapus mekanisme persistensi (cara script tersebut memulihkan dirinya sendiri). Selama celah masuk dan script pembantu masih tertinggal, malware akan otomatis terpasang ulang tanpa perlu hacker membobol server dari awal.
Malware modern hampir tidak pernah berdiri sendiri sebagai satu file tunggal. Pelaku biasanya memasang arsitektur bertingkat yang terdiri dari pintu masuk utama, payload, dan beberapa dropper tersembunyi. Dropper adalah script kecil yang tugasnya murni mengunduh atau menulis ulang file payload jika file tersebut hilang dari disk. Ketika kamu menghapus file berekstensi asing di folder wp-content/uploads atau public_html, script dropper yang bersarang di folder lain—sering kali menyamar sebagai file inti CMS seperti wp-settings.php atau file tema—tetap aktif di background. Begitu ada request HTTP yang memicu file tersebut, atau ketika proses background berjalan, script dropper akan langsung mengecek ketersediaan payload. Jika file tidak ditemukan, ia akan membuatnya kembali menggunakan fungsi PHP seperti file_put_contents() dengan konten yang dikodekan dalam format base64. Selain dropper berbasis file, mekanisme pemulihan malware sering memanfaatkan cron job server atau scheduler internal CMS. Jika attacker sudah berhasil menyusupkan jadwal eksekusi ke crontab user hosting, server sendiri yang akan menjalankan perintah pengunduhan malware setiap beberapa menit sekali, terlepas dari berapa kali kamu menghapus filenya secara manual.
Sebagian besar pengguna hanya memeriksa folder utama atau folder yang tanggal modifikasinya baru saja berubah. Sayangnya, pembuat malware sangat paham cara memanipulasi atribut file menggunakan fungsi touch() di Linux agar timestamp file terlihat sama persis dengan file sistem aslinya. Ada beberapa titik persembunyian klasik yang kerap luput dari pemeriksaan: Titik pertama adalah konfigurasi PHP tingkat direktori, khususnya file .user.ini atau .htaccess. Attacker bisa menambahkan direktif auto_prepend_file atau auto_append_file. Dengan direktif ini, web server dipaksa mengeksekusi script PHP berbahaya sebelum atau sesudah file PHP apa pun dijalankan di situsmu. Script tersebut bahkan tidak perlu berada di folder web publik; ia bisa disembunyikan di direktori temporer atau folder root akun hosting. Titik kedua adalah basis data (database). Pada platform seperti WordPress, malware sering menyuntikkan payload ke dalam tabel wp_options, khususnya pada baris dengan status autoload aktif. Script jahat juga sering disisipkan ke dalam hook JavaScript di tabel post, atau didaftarkan sebagai pengguna baru dengan role administrator tersembunyi. Scanner berbasis file biasa tidak akan mendeteksi infeksi ini karena seluruh kodenya tersimpan rapi di dalam baris database MySQL. Titik ketiga adalah symlink dan direktori cache. Terkadang malware membuat tautan simbolik (symlink) dari dalam direktori situs menuju folder /tmp atau file sistem lain yang tidak terpindau oleh scanner direktori lokal. Mereka juga kerap memanfaatkan folder cache plugin optimasi, menyaru sebagai file asset statis yang tampak tidak berbahaya.
Menghapus file dari disk tidak langsung menghentikan proses yang sedang dieksekusi oleh worker PHP-FPM atau web server di memori RAM. Jika ada loop proses malware yang sedang berjalan (biasanya berupa proses loop tak terbatas yang menunggu sinyal jaringan), proses tersebut tetap bisa menulis file kembali ke disk selama proses PHP masih aktif. Jika kamu mengelola VPS atau memiliki akses SSH ke akun hosting, langkah pertama saat investigasi adalah memeriksa daftar proses dan tugas terjadwal yang sedang aktif atas nama user yang bersangkutan:
BASH
# Periksa proses aktif milik user web
ps aux | grep php

# Periksa daftar crontab terjadwal milik user saat ini
crontab -l

# Cari file PHP yang dimodifikasi dalam 24 jam terakhir di direktori publik
find ./public_html -type f -name '*.php' -mtime -1
Perhatikan apakah ada proses PHP dengan waktu eksekusi CPU yang sangat lama atau berjalan dari path yang mencurigakan seperti /tmp, /dev/shm, atau folder uploads. Jika ditemukan proses asing yang terus berjalan, proses tersebut harus dihentikan paksa (kill) terlebih dahulu sebelum kamu membersihkan file dari disk, agar proses di memori tidak sempat memulihkan file yang baru saja dihapus.
Plugin keamanan dan scanner antivirus hosting (seperti ClamAV atau scanner bawaan cPanel) sangat berguna untuk deteksi awal, namun mengandalkan fitur 'auto-clean' dari tool tersebut sering menjadi awal mula siklus infeksi berulang. Scanner bekerja berdasarkan signature (tanda tangan digital) atau pola heuristik dari malware yang sudah diketahui. Jika malware menggunakan teknik obfuscation (penyamaran kode) bertingkat atau teknik baru, scanner hanya akan mendeteksi sebagian file dan melewatkan sisanya. Ketika plugin security hanya menghapus 8 dari 10 file yang terinfeksi, 2 file yang tersisa berfungsi sebagai benih yang akan menumbuhkan kembali 8 file lainnya dalam hitungan jam. Fitur pembersihan otomatis juga berisiko merusak struktur file inti jika malware disuntikkan ke tengah-tengah file penting seperti index.php atau wp-config.php, yang berujung pada error website tidak bisa diakses (White Screen of Death atau HTTP 500). Tool otomatis harus diposisikan sebagai pemberi petunjuk lokasi, bukan penuntas masalah. Analisis manual terhadap bagaimana file tersebut masuk, file mana saja yang memiliki izin eksekusi mencurigakan, dan integritas file inti tetap menjadi tugas wajib administrator.
Kunci membersihkan website yang terinfeksi bukan kecepatan menghapus file, melainkan ketepatan urutan langkah. Jika kamu membersihkan file sebelum menutup celah masuknya, website akan kembali terinfeksi bahkan sebelum proses pembersihan selesai. Berikut alur kerja yang terbukti efektif: Langkah pertama: ubah akses dan putus komunikasi luar. Pasang halaman pemeliharaan (maintenance mode) atau batasi akses situs hanya untuk IP kamu sendiri lewat konfigurasi web server. Ini mencegah script backdoor diakses dari luar via HTTP selama proses perbaikan, sekaligus menghentikan serangan brute force yang mungkin masih berlangsung, seperti eksploitasi pada endpoint XML-RPC yang pembahasannya dapat kamu lihat di artikel mengenai analisis log web server untuk serangan XML-RPC. Segera ganti seluruh kredensial: password cPanel/SSH, password database, FTP, dan semua user administrator CMS. Langkah kedua: audit tugas terjadwal (cron) dan proses. Periksa crontab user di server dan pastikan tidak ada scheduler asing yang memanggil script curl atau wget ke domain luar. Hentikan proses-proses PHP yang berjalan tidak wajar di latar belakang. Langkah ketiga: ganti total file inti dan komponen pihak ketiga, jangan bersihkan manual. Untuk CMS seperti WordPress, langkah teraman bukan mengedit file yang terinfeksi satu per satu, melainkan mengganti seluruh folder wp-admin, wp-includes, dan semua file PHP di direktori root dengan unduhan resmi versi yang sama. Lakukan hal yang sama untuk plugin dan tema: hapus folder plugin lama sepenuhnya lalu pasang ulang versi bersih dari repositori resmi. Attacker sering menyelipkan backdoor di dalam file plugin yang namanya terdengar asli. Langkah keempat: periksa direktori penyimpanan data dinamis. Folder seperti wp-content/uploads biasanya hanya ditujukan untuk menyimpan file media (gambar, PDF, video). Jika ada file .php, .phtml, atau file skrip executable lain di dalam folder uploads, file tersebut hampir pasti merupakan malware dan harus dihapus. Pastikan juga konfigurasi web server melarang eksekusi script PHP langsung di dalam folder uploads. Langkah kelima: audit database dan konfigurasi. Buka database melalui phpMyAdmin atau MySQL CLI, periksa daftar user administrator, dan hapus user yang tidak dikenal. Periksa tabel konfigurasi untuk memastikan nilai seperti siteurl dan script inject tidak mengarah ke domain luar. Periksa file wp-config.php baris demi baris, pastikan salt keys diperbarui agar sesi login lama yang mungkin dicuri attacker otomatis hangus. Langkah keenam: tambal celah asal (root cause). Mengapa malware bisa masuk pertama kali? Apakah karena versi plugin lama yang memiliki celah Arbitrary File Upload? Apakah password FTP lemah? Atau kamu menggunakan tema/plugin bajakan (nulled) yang memang sudah ditanami backdoor sejak awal? Menghapus infeksi tanpa menambal celah masuknya hanya menunda waktu infeksi berikutnya. Membersihkan malware web membutuhkan pendekatan sistematis dari lapisan proses, konfigurasi, file, hingga database. Begitu kamu memutus jalur komunikasi attacker, membersihkan proses di memori, dan mengganti seluruh komponen kode dengan file sumber yang valid, siklus kemunculan kembali malware akan terhenti permanen.