Halo teman-teman pembaca, pada artikel ini saya ingin mengajak kalian mengenal salah satu kerentanan yang cukup populer yaitu SQL injection. Apa itu SQL injection? SQL injection adalah sebuah kerentanan pada aplikasi yang memiliki basis data yang memberikan celah bagi peretas untuk mengubah kueri SQL sehingga bisa memunculkan data-data sensitif yang tersimpan di database. Kerentanan SQL injection dapat terjadi karena pengembang aplikasi tidak mengimplementasikan filter karakter khusus yang digunakan dalam sintaks SQL pada form input aplikasi sehingga penyerang dapat menginputkan instruksi untuk mengakses database. Selain itu SQL injection juga bisa terjadi apabila personel backend tidak mengimplementasikan atau mengkonfigurasi Web Application Firewall (WAF) atau Intrusion Prevention System (IPS) pada arsitektur jaringan dengan baik, sehingga database aplikasi dapat diakses langsung dari celah yang ditemukan. SQL injection dapat dikategorikan menjadi tiga jenis, antara lain:
- In-band SQLi Merupakan jenis serangan SQL injection yang sangat umum dan mudah sekali untuk dilakukan eksploitasi. In-band SQL injection dapat terjadi ketika seseorang menyerang dengan menggunakan saluran komunikasi yang sama untuk meluncurkan serangan dan untuk mendapatkan hasilnya. Serangan In-band SQLi dapat dibagi lagi menjadi dua tipe, sebagai berikut:
- Error-based SQLi
- Union-based SQLi
- Inferential (Blind) SQLi Inferential atau blind SQLi adalah jenis serangan SQL injection yang hasilnya tidak bisa dilihat secara langsung melainkan perlu dianalisa. Misalnya ketika kueri yang diinjeksikan berhasil atau bernilai true maka tampilan pada website akan berbeda dengan kueri yang bernilai false. Tidak hanya itu, bisa juga dengan melihat waktu respons yang dibutuhkan seperti ketika kueri bernilai true maka waktu respons lebih lama dibanding dengan kueri yang bernilai false. Berdasarkan penjelasan tersebut maka blind SQLi dapat dikelompokkan menjadi:
- Boolean-based (content-based) Blind SQLi Merupakan teknik yang mengharuskan penyerang mengirimkan kueri SQL ke database dan memaksa aplikasi mengembalikan hasil yang berbeda bergantung pada hasil yang dikeluarkan kueri bernilai TRUE atau FALSE. Berikut ini saya sertakan contoh serangan dari boolean-based blind SQLi.
- Time-based Blind SQLi Merupakan teknik yang mengharuskan penyerang mengirimkan kueri SQL ke database yang memaksa database menunggu selama kurun waktu tertentu (dalam detik) sebelum merespons. Waktu respons tersebut menunjukkan hasil kueri TRUE atau FALSE. Penjelasan lebih lanjut dapat dibaca pada link berikut https://www.sqlinjection.net/time-based/.
Gambar tersebut menunjukkan tampilan kueri yang bernilai true. Kemudian apabila false akan menunjukkan tampilan seperti ini.
Berdasarkan perbedaan tampilan true dan false maka penyerang dapat melakukan brute force untuk menggali informasi yang tersimpan di database. Contohnya jika saya memiliki database bernama dvwa dan saya menginjeksikan kueri ' OR SUBSTRING(DATABASE(),1,1)='d'# maka tampilan yang menandakan true akan muncul sehingga dapat diartikan bahwa benar database website yang menjadi target memiliki huruf pertama d.
- Out-of-band SQLi Merupakan serangan yang membutuhkan bantuan dari server lain untuk menampilkan hasil kueri yang telah diinjeksi ke web target. Pada out-of-band SQLi ini peretas tidak bisa menyerang dan melihat hasilnya pada server yang sama. Untuk lebih jelasnya bisa dibaca di sini https://infosecwriteups.com/out-of-band-oob-sql-injection-87b7c666548b.
Pada gambar di atas ketika pengguna memasukkan kueri 1' or 1=1-- - maka seluruh data user akan ditampilkan. Pengguna juga dapat menampilkan semua tabel yang ada pada database tersebut dengan cara mengetikkan kueri 1' UNION SELECT table_name, 2, 3 FROM information_schema.tables-- - Sebelum menjalankan kueri tersebut kita perlu mengetahui terlebih dahulu jumlah kolom yang ada pada tabel yang sedang kita eksploitasi. Hasilnya akan terlihat seperti gambar berikut
Secara umum kerentanan SQL injection terjadi karena input yang tidak disanitasi sehingga menjadi celah bagi penyerang untuk memasukkan kueri SQL yang dapat digunakan untuk mencuri data dan mengakses informasi penting. Oleh karena itu cara pencegahannya dapat dilakukan dengan menerapkan prepared statement atau bisa juga dengan membuat sanitasi dan validasi pada setiap input yang ada. Berikut ini adalah penerapan prepared statement sebagai salah satu upaya pencegahan serangan SQL injection.
Setelah diterapkan prepared statement seperti pada gambar di atas maka kueri SQL yang dituliskan pada kolom input tidak akan dieksekusi seperti terlihat pada gambar di bawah ini
Demikian pembahasan tentang kerentanan SQL injection. Semoga bermanfaat dan bisa diterapkan untuk tujuan yang positif.
Artikel ini juga dapat dibaca di: https://forum.surabayahackerlink.org/d/3655-mengenal-tentang-sql-injection
Referensi:
0 Comments