SQL Injection (SQLI) adalah jenis serangan yang digunakan penjahat siber untuk mengeksploitasi kerentanan software dalam aplikasi web. Ini memungkinkan penyerang untuk melihat data yang biasanya tidak dapat mereka ambil.
Seorang penyerang dapat memasukkan karakter kontrol SQL dan kata kunci perintah (misalnya, tanda kutip tunggal (‘), tanda kutip ganda (“), sama (=), komentar (- -), dll.) Untuk mengubah struktur kueri. Menggunakan karakter kontrol ini dengan perintah SQL umum (misalnya, SELECT, FROM, DELETE, dll.) Memungkinkan akses atau pengambilan elemen data dari server database backend.
SQL Injection dapat diklasifikasikan menjadi tiga kategori
1. In-band SQLI (Classic SQLI)
In-band SQL Injection adalah serangan SQL Injection yang paling umum dan mudah dieksploitasi. In-band SQL Injection terjadi ketika penyerang dapat menggunakan saluran komunikasi yang sama untuk meluncurkan serangan dan mengumpulkan hasil. Sebagai contoh penyerang dapat menggunakan komunikasi HTTP menyebarkan serangan ke backend dan mendapatkan hasil di saluran yang sama.
Ada dua tipe utama In-band SQL Injection
Error-based SQLI: Error-based SQLI adalah teknik In-band SQL Injection yang mengandalkan pesan kesalahan yang dilemparkan oleh database server untuk mendapatkan informasi tentang struktur database. Dalam beberapa kasus, error-based SQL injection saja sudah cukup bagi penyerang untuk menghitung seluruh database.
Union-based SQLI: Union-based SQLI adalah teknik In-band SQL Injection yang memanfaatkan operator SQL UNION untuk menggabungkan hasil dari dua atau lebih pernyataan SELECT menjadi satu hasil yang kemudian dikembalikan sebagai bagian dari respons HTTP.
2. Inferential SQLI (Blind SQLI):
Inferential SQL Injection, tidak seperti in-band SQLI, mungkin memerlukan waktu lebih lama bagi penyerang untuk mengeksploitasi, namun, ini sama berbahayanya dengan bentuk SQL Injection lainnya. Dalam serangan inferential SQLI, tidak ada data yang benar-benar ditransfer melalui aplikasi web dan penyerang tidak akan dapat melihat hasil serangan in-band (itulah sebabnya serangan semacam itu biasanya disebut sebagai “seranganblind SQL Injection”).
Sebaliknya, penyerang dapat merekonstruksi struktur database dengan mengirimkan payload, mengamati respons aplikasi web dan perilaku yang dihasilkan dari database server. Ada dua jenis SQL Injection inferensial yaitu SQLI berbasis Blind-boolean dan SQLI berbasis Blind-time.
Boolean-based (content-based) Blind SQLI: Boolean-based SQL Injection adalah teknik inferential SQL Injection yang mengandalkan pengiriman kueri SQL ke database yang memaksa aplikasi untuk mengembalikan hasil yang berbeda bergantung pada apakah kueri mengembalikan hasil TRUE atau FALSE. Bergantung pada hasilnya, konten dalam respons HTTP akan berubah, atau tetap sama. Hal ini memungkinkan penyerang untuk menyimpulkan apakah payload yang digunakan mengembalikan true atau false, meskipun tidak ada data dari database yang dikembalikan.
Time-based Blind SQLI: Time-based SQL Injection adalah teknik inferential SQL Injection yang mengandalkan pengiriman kueri SQL ke database yang memaksa database untuk menunggu selama jumlah waktu tertentu (dalam detik) sebelum merespons. Waktu respons akan menunjukkan kepada penyerang apakah hasil kueri TRUE atau FALSE. tergantung pada hasilnya, respons HTTP akan dikembalikan dengan penundaan, atau segera dikembalikan. Hal ini memungkinkan penyerang untuk menyimpulkan apakah payload yang digunakan menampilkan true atau false, meskipun tidak ada data dari database yang dikembalikan.
3. Out-of-band SQLI
Out-of-band SQL Injection tidak terlalu umum, sebagian besar karena bergantung pada fitur yang diaktifkan pada server database yang digunakan oleh aplikasi web. Out-of-band SQL Injection terjadi ketika penyerang tidak dapat menggunakan saluran yang sama untuk meluncurkan serangan dan mengumpulkan hasil. Teknik out-of-band, menawarkan penyerang alternatif dari teknik inferential time-based, terutama jika respons server tidak terlalu stabil (membuat serangan inferential time-based tidak dapat diandalkan).
Contoh SQL Injection
SELECT * FROM pengguna WHERE nama = 'a' or 't'='t';
Comments
Post a Comment