Halo friends, kali ini kita akan bahas salah satu bentuk kerentanan dari SQL Injection yaitu second order SQL injection atau terkadang disebut stored SQL injection.
Pada dasarnya serangan ini memiliki karakteristik yang sama, yaitu sama-sama melakukan manipulasi query SQL pada logic suatu aplikasi, namun yang paling membedakan adalah dimana dan kapan waktu tereksekusinya. Jika pada umumnya SQL Injection (SQLi) itu langsung tertrigger ketika ada kerentanan, maka di Second Order SQLi ini biasanya tidak langsung tertrigger tetapi dia akan tertrigger di halaman atau fungsi yang lain.
Contoh simulasi:
Di halaman pendaftaran, attacker menuliskan username budi123′” lalu disimpan, tidak ada error dan semua normal-normal saja.
Lalu di sisi yang lain ketika admin melihat informasi user di halaman detail user seperti ini /user/detail/budi123′”, muncul error query SQL yang biasanya seperti ini:
Error: You have an error in your SQL syntax.
Hal ini dikarenakan username budi'” menjadi sebuah query sehingga query ini yang dieksekusi di sisi backend:
Select * from Users where username = “budi123′””; |
Hal ini mentrigger error karena query tidak tertutup sempurna. Inilah yang disebut dengan Second Order SQL Injection.
Bagaimana mendeteksinya?
Dari sisi pentester untuk mendeteksi second order SQL Injection, seorang pentester perlu memastikan menjalankan seluruh siklus penuh dari interaksi pengguna dengan aplikasi. Ini berarti menguji berbagai fungsi dan halaman secara menyeluruh untuk melihat apakah ada anomali atau error yang muncul di lokasi berbeda dari tempat input awal.
Untuk mendeteksi second order SQL Injection dari sisi admin, penting untuk secara rutin memeriksa log error dan memberikan perhatian khusus pada setiap error SQL yang muncul.
Lalu bagaimana mengatasinya?
Untuk mengatasinya lakukan sanitasi atau gunakan prepared statement ketika user melakukan input data sehingga inputan dapat diterima sebagai string biasa bukan query.
Beberapa langkah yang dapat dilakukan antara lain:
- Sanitasi Inputan. Beberapa kasus jika masih menggunakan bahasa yang sudah lama tidak diupdate maka harus membuat fungsi sanitasi sendiri, dapat dimulai dengan mengilangkan karakter-karakter berbahaya yang dapat memanipulasi query.
- Prepared Statements. Jika menggunakan library database maka manfaatkan prepared statements yang sudah disediakan. Prepared statements dapat memastikan bahwa input dari pengguna diperlakukan sebagai data, bukan sebagai bagian dari query SQL.
- Validasi. Tambahkan validasi inputan agar memastikan sesuai dengan inputan yang diperbolehkan. Misal validasi inputan hanya boleh integer, atau hanya boleh berformat email, url, dll.
Dengan langkah-langkah ini kita dapat meminimalisir resiko yang dapat terjadi di kemudian hari, dan jangan lupa ya friends tetap lakukan pentest secara berkala untuk memastikan tidak ada kerentanan yang terkespos di aplikasi kita.