Cara Menemukan Backdoor Tersembunyi di WordPress dengan WP-CLI dan SQL
30 de julio de 2026
0
Internet TechnologyComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
Menekan tombol perbarui core pada situs WordPress yang dibuat oleh pihak ketiga sering kali membuat ragu. Karena khawatir tema atau plugin kustom mengalami kendala hingga menyebabkan Layar Putih Kematian (White Screen of Death), pembaruan terus ditunda sampai akhirnya situs penuh dengan kerentanan. Saat rasa cemas bahwa situs mungkin telah diretas mulai menghampiri, berikut adalah prosedur pemeriksaan praktis untuk memeriksa database dan server dengan cepat.
Penyerang biasanya masuk secara samar-samar. Mereka menyusup dengan menyunting tabel wp_usermeta di database secara langsung untuk memberikan hak akses administrator ke akun yang sudah ada. Hal ini sulit terlihat di daftar login biasa, tetapi akan langsung muncul jika Anda memeriksa DB secara langsung.
`sql
SELECT
u.ID,
u.user_login,
u.user_email,
u.user_registered,
m.meta_value AS capabilities
FROM
wp_users u
INNER JOIN
wp_usermeta m ON u.ID = m.user_id
WHERE
m.meta_key = 'wp_capabilities'
AND (
m.meta_value LIKE '%"administrator"%'
OR m.meta_value LIKE '%"administrator":true%'
)
ORDER BY
u.user_registered DESC;
`
Langkah berikutnya adalah mengecek sistem file. Jika ada file PHP yang berkeliaran di direktori wp-content/uploads—yang seharusnya hanya berisi gambar atau dokumen—hampir dapat dipastikan itu adalah backdoor. Buka terminal SSH dan periksa apakah ada file berbahaya.
`bash
find wp-content/uploads/ -type f -name "*.php" -ls
find . -type f -name "*.php" -exec grep -HnE "(eval(|base64_decode(|gzinflate(|passthru(|shell_exec()" {} ;
wp core verify-checksums --include-root
`
Log juga perlu diperiksa. Serangan yang menargetkan REST API biasanya mengirimkan banyak permintaan POST dalam waktu singkat dan mendapatkan respons 200 atau 201. Ambil permintaan yang menunjukkan respons mencurigakan dari access.log Nginx.
`bash
grep -E "POST|PUT" /var/log/nginx/access.log | grep -E "/wp-json/|rest_route=" | awk '/ {print $1, $4, $6, $7, $9}' | sort | uniq -c | sort -nr | head -n 30
`
Menerapkan patch secara langsung di situs produksi yang sedang berjalan bukanlah bentuk keberanian, melainkan kecerobohan. Buat lingkungan staging terlebih dahulu dengan mengkloning seluruh database dan sistem file.
`bash
wp db export production_backup.sql --add-drop-table
rsync -avz --exclude='wp-content/cache' /var/www/html/ staging:/var/www/staging/
wp db import production_backup.sql
wp search-replace 'https://example.com' 'https://staging.example.com' --skip-columns=guid
wp plugin list --update=available --fields=name,version,update_version,requires_php --format=table
`
Setelah pengkloningan selesai, lakukan pembaruan dan uji fitur-fitur utama selama 5 menit. Pengujian langsung seperti pendaftaran anggota, login, menambahkan ke keranjang belanja, membuka halaman pembayaran, hingga mengirim formulir kontak akan memberikan rasa tenang.
Ada situasi pelik di mana pembaruan core tidak bisa dilakukan secara langsung karena pengembang plugin belum merilis pembaruan. Dalam kondisi tersebut, Anda perlu mengulur waktu dengan memblokir akses ke jalur tertentu di tingkat server atau WAF. Jika menggunakan Nginx, blokir endpoint pembuatan pengguna REST API dan pemrosesan batch pada nginx.conf, kecuali untuk IP Anda.
`nginx
location ~* ^/wp-json/(batch/v1|wp/v2/users) {
limit_except GET {
allow 192.0.2.1;
deny all;
}
try_files $uri args;
}
`
Sebagai langkah antisipasi, tambahkan skrip backup untuk mengunggah folder DB dan uploads ke S3.
`bash
#!/bin/bash
WP_PATH="/var/www/html"
BACKUP_DIR="/tmp/wp_backups"
DATE=$(date +%Y%m%d_%H%M%S)
S3_BUCKET="s3://my-wordpress-secure-backups"
mkdir -p $BACKUP_DIR
wp db export BACKUP_DIR/db_DATE.sql --path=$WP_PATH --quiet
tar -czf BACKUP_DIR/files_DATE.tar.gz -C $WP_PATH wp-content/uploads/
aws s3 cp BACKUP_DIR/db_DATE.sql S3_BUCKET/db_DATE.sql
aws s3 cp BACKUP_DIR/files_DATE.tar.gz S3_BUCKET/files_DATE.tar.gz
find $BACKUP_DIR -type f -mtime +7 -delete
`
Tugas belum selesai hanya dengan menghapus kode berbahaya dan menerapkan patch keamanan, karena penyerang masih bisa masuk kembali menggunakan cookie sesi yang telah dicuri. Hapus semua sesi dan acak ulang kunci salt pada wp-config.php.
`bash
wp user list --field=ID | xargs -n 1 wp user session destroy --all
wp config shuffle-salts
`
Matikan juga fitur penyuntingan file plugin atau tema secara langsung dari halaman admin. Ini adalah langkah pengamanan minimal untuk mencegah penyuntikan kode meskipun penyerang berhasil mendapatkan hak akses. Tambahkan dua baris berikut ke wp-config.php.
`php
define( 'DISALLOW_FILE_EDIT', true );
define( 'DISALLOW_FILE_MODS', true );
`
Terakhir, tempatkan filter khusus di direktori mu-plugins untuk mencegah pengguna yang belum login mengintip daftar pengguna melalui REST API.
`php
<?php
/**
`