Semua panduan
Tingkat KritisKesalahan Konfigurasi

Backup database yang terekspos: apa yang terjadi saat /backup.sql dapat dijangkau

Backup database — file .sql, dump terkompresi, arsip zip database — terkadang dibuat langsung di direktori yang dapat diakses web lalu dibiarkan di sana. Satu request yang berhasil ke /backup.sql atau /dump.sql menyerahkan setiap baris di setiap tabel kepada penyerang tanpa menyentuh logika aplikasi Anda.

Apa itu

Script backup, panel kontrol hosting, dan tool ekspor manual umumnya menulis file dump dengan nama yang mudah ditebak: backup.sql, dump.sql, database.sql, db.sql.gz, backup.zip. Ketika file ini masuk ke web root dan server tidak memblokirnya secara eksplisit, file itu menjadi file biasa yang bisa diunduh. Penyerang menjalankan scan otomatis yang meminta puluhan nama umum ini ke setiap host yang bisa mereka jangkau.

AppSafe memeriksa path yang paling umum — /backup.sql, /dump.sql, /database.sql, /db.sql.gz, dan lainnya — dan menandai path mana pun yang mengembalikan respons 200 dengan konten yang terlihat seperti dump SQL atau arsip. Pemeriksaan ini menangkap SQL teks biasa maupun format terkompresi.

Kenapa penting

Dump SQL berisi setiap baris di setiap tabel pada saat dibuat: akun pengguna, hash password, alamat email, data pribadi, token sesi, riwayat pembayaran, dan state internal aplikasi. Mengunduh dump hanya butuh satu request HTTP yang tidak meninggalkan jejak di log aplikasi Anda — web server menyajikannya seperti file statis biasa.

Tidak seperti API key yang bocor, database yang bocor tidak bisa dirotasi. Begitu seseorang memiliki salinan tabel pengguna Anda, pelanggarannya bersifat permanen bagi pengguna tersebut. Tergantung isi dump-nya, Anda mungkin wajib menyampaikan pemberitahuan pelanggaran data berdasarkan GDPR, CCPA, atau HIPAA, ditambah biaya operasional untuk memberi tahu setiap pengguna yang terdampak.

Cara memperbaiki

Pindahkan backup ke luar web root

Perbaikan yang benar adalah menulis file backup ke direktori yang tidak bisa dijangkau web server — path seperti /var/backups/ atau bucket object storage dengan ACL privat, bukan subdirektori dari /var/www/. Tinjau cron job atau script backup dan perbarui path tujuannya.

Blokir ekstensi backup umum di nginx

Sebagai langkah defense-in-depth, tolak request untuk file SQL dan ekstensi arsip umum di level server, di mana pun file disimpan.

location ~* \.(sql|sql\.gz|bak|dump|tar|tar\.gz|tar\.bz2|zip)$ {
  deny all;
  return 404;
}
Hapus file dump yang sudah ada di web root

Jika Anda menemukan file yang terekspos, segera hapus. Lalu telusuri bagaimana file itu bisa sampai di sana — perbaiki script atau proses yang menaruhnya, agar tidak muncul lagi pada jadwal berikutnya.

Pastikan path mengembalikan 404

Setelah dibersihkan, pastikan path-path umum tersebut sudah terblokir.

for path in /backup.sql /dump.sql /database.sql /db.sql.gz; do
  code=$(curl -so /dev/null -w "%{http_code}" "https://yourdomain.com$path")
  echo "$path → $code"
done
# Every line must print 404

FAQ

Bagaimana penyerang tahu harus mencoba /backup.sql di situs saya?

Mereka tidak menargetkan Anda secara khusus. Scanner otomatis terus-menerus meminta puluhan nama backup umum ke jutaan host. File yang ada akan mengembalikan 200 dan langsung diunduh sebelum Anda tahu harus mencarinya.

File itu hanya ada selama satu jam. Apakah kerusakannya sudah terjadi?

Mungkin saja. Scan otomatis berjalan sepanjang waktu dan file sering ditemukan dalam hitungan menit setelah muncul. Jika Anda punya access log, periksa apakah path tersebut pernah diminta — jika ya, perlakukan sebagai pelanggaran yang terkonfirmasi.

Bisakah saya melindungi file dengan password saja daripada memindahkannya?

Basic auth pada satu file itu rapuh dan mudah salah konfigurasi. Jawaban yang tepat adalah menghapus file dari lokasi mana pun yang dapat diakses web. Backup harus disimpan di tempat yang tidak bisa dijangkau server HTTP.

Apakah aplikasimu terpengaruh?

AppSafe memeriksa ini dan puluhan masalah lain dalam satu pemindaian gratis.

Pindai aplikasiku gratis