SQL Injection, ouwhh yeaahhh!

  • 0
Apa sebenarnya SQL Injection? Untuk memahaminya, kita perlu memahami dahulu apa itu SQL. Sebelum paham apa itu SQL, maka perlu tahu dulu apa itu Sistim Manajemen Basis Data (Database Management System, atau DBMS). Dan sebelum paham tentang DBMS, harus tahu dulu apa itu Basis Data (Dabatase). Nah, kalau sudah paham semuanya, barulah kita bicara tentang apa artinya dan apa yang bisa dibuat dengan teknik SQL Injection. Ouwhh yeaahh?


Tulisan ini berangkat dari sebuah tulisan publik pada Juni 2016 lalu yang bicara soal SQL Injection. Awalnya saya tidak terlalu tertarik membacanya. Lalu seorang teman mengirim link-nya di group WhatsApp. Saya baca, malah saya kasihan sama penulisnya. Mungkin gagal paham, atau sukses bingung, yang mana sajalah. Tulisan ini sekedar untuk membantu memberi tambahan pemahaman tentang apa itu SQL Injection. Kepada sang penulis tadi, atau kepada teman-teman yang penasaran ingin tahu saja.





Mari mulai dengan defenisi



Basis Data (selanjutnya disebut: Database), adalah kumpulan informasi yang disimpan dalam komputer secara sistematik sehingga dapat diperiksa/diolah menggunakan suatu program komputer (software) untuk memperoleh informasi lainnya dari database tersebut. Secara sistematik disini artinya informasi disimpan dalam bentuk tabel-tabel yang saling berhubungan. Setiap tabel memiliki kolom-kolom (field) dan data terkecil disimpan dalam bentuk baris-baris (row). Bayangkan sebuah tabel Pegawai yang menyimpan data para pegawai disebuah kantor. Tabel Pegawai ini terdiri dari kolom-kolom: Nomor Induk, Nama, Jenis Kelamin, Alamat, dll. Lalu informasi tentang setiap pegawai disimpan dalam baris-baris, yakni satu pegawai pada satu baris.

Istilah 'suatu program komputer' dari atas selanjutnya disebut sebagai Sistim Manajemen Basis Data (Database Management System, atau DBMS). Ini adalah sebuah software yang melakukan operasi manipulasi data pada Database. Jadi operasi seperti menambah data (insert), menghapus data (delete), memperbarui data (update) sebenarnya dilakukan oleh DBMS. Manusia memberi perintah ke DBMS, lalu DBMS-lah yang melakukan operasi insert, delete, update ke Database.

Perintah seperti apakah yang diberikan manusia kepada DBMS? Perintah dari manusia haruslah dalam suatu bahasa yang dikenal secara standar oleh DBMS. Bahasa ini namanya 'Bahasa Query Terstruktur' (Structured Query Language, atau SQL). Jadi, SQL itu adalah sebuah bahasa (seperti juga bahasa Indonesia, bahasa Inggris, dll) yang dikenali oleh DBMS yang digunakan untuk memerintahkan DBMS melakukan operasi insert, delete atau update pada Database.

Berikut adalah ilustrasi bagaimana kira-kira bahasa Indonesia diterjemahkan ke bahasa SQL (untuk menghapus data dan menampilkan data pada sebuah tabel Pegawai). Dalam bahasa Indonesia:
Hapus data pegawai yang bernama Andi.
Lalu tampilkan semua data pegawai yang diurutkan berdasarkan Nomor Induk.
Dalam bahasa SQL:
DELETE FROM PegawaiTable WHERE Nama = 'Andi';
SELECT * FROM PegawaiTable ORDER BY NomorInduk;

Perhatikan bahwa dalam bahasa Indonesia (bahasa manusia), setiap kalimat diakhiri dengan titik. Sedangkan dalam bahasa SQL, setiap kalimat (dalam bahasa SQL: kalimat = query) diakhiri dengan titik koma.

Nah sekarang kita sampai kepada SQL Injection. Coba dipikir-pikir juga nanti, ada nggak kira-kira yang dinamakan 'Bahasa Indonesia Injection'?

SQL Injection adalah sebuah teknik yang menyalahgunakan celah keamanan sebuah aplikasi. Celah yang dimaksud adalah kelemahan pada aplikasi karena 'tidak menyaring' masukkan (input) dari manusia/pengguna (user) sebelum mengirim perintah ke DBMS. Idealnya, ketika user mengetikkan input, aplikasi harus terlebih dahulu menyaringnya sebelum mengirim perintah SQL untuk manipulasi data ke DBMS. Bila tidak disaring, maka user bisa saja memasukkan suatu input tertentu yang bila dikirim oleh aplikasi ke DBMS, malah akan merusak isi Database.

Cermati ilustrasi berikut untuk melihat bagaimana semua defenisi di atas bisa berhubungan.


Dari ilustrasi di atas, perhatikan bahwa umumnya pada sebuah sistem yang aman, user tidak bisa mengakses langsung ke DBMS. User hanya bisa mengakses aplikasi, lalu hanya aplikasi yang bisa mengakses DBMS.



Contoh SQL Injection



Bayangkan sebuah aplikasi web yang memiliki sebuah halaman untuk menampilkan data Pegawai yang disaring atas nama pegawai tertentu berdasarkan input dari user dengan menggunakan baris kode berikut ini:
'variabel untuk mengambil input dari user
Dim strInput as String = ""

'variable yang berisi format perintah SQL yang akan dikirim ke server DBMS
'perhatikan bahwa baris berikut ini memasukkan input dari user ke perintah SQL tanpa melakukan penyaringan
Dim strCommand as String = "SELECT * FROM TablePegawai WHERE Nama = '" & strInput & "';"

'baris-baris berikut adalah untuk melakukan koneksi ke server DBMS dan mengirim perintah yang dibuat tadi ke DBMS
Dim objConnection as New SqlConnection
Dim objCommand as New SqlCommand(objConnection, strCommand)
objCommand.Execute()

Sekarang, coba kita uji. Misalkan seorang user, ingin menampilkan data Pegawai yang bernama Budi Selamat. Melalui halaman pada aplikasi, user mengetikkan budi selamat. Maka, perintah SQL yang akan dikirim oleh aplikasi ke DBMS akan mejadi seperti ini:

SELECT * FROM TablePegawai WHERE Nama = 'budi selamat';

Disini, perintah SQL nya sudah sah dan benar dikenali, yakni memilih dan menampilkan data dari tabel Pegawai yang kolom Nama berisi Budi Selamat.

Kemudian ada user lain yang akan melakukan SQL Injection dengan mengetikkan budi selamat'; delete from tablepegawai where nama = 'budi selamat. Tanpa menyaring ini, maka perintah SQL yang akan dikirim oleh aplikasi web ke DBMS akan menjadi seperti ini:

SELECT * FROM TablePegawai WHERE Nama = 'budi selamat'; delete from tablepegawai where nama = 'budi selamat';

Apakah perintah ini sah dan benar? Ya, sah dan benar! Perintah tersebut terdiri dari dua kalimat (query) dan bahasa keduanya sudah benar dan DBMS memang boleh dijinkan menerima perintah yang berisi lebih dari satu query sekaligus.

Perhatikan setiap query pada perintah SQL diatas. Query pertama benar dan sesuai dengan apa yang dikehendaki, yakni menampilkan data pegawai dari tabel Pegawai yang bernama Budi Selamat. Namun query kedua (setelah titik koma), adalah buatan si user, disuntikkan lewat input di halaman aplikasi yang tidak disaring, dan isinya adalah: "hapus data pegawai yang bernama Budi Selamat dari tabel Pegawai"..!! Kenalkan, ini salah satu contoh dari teknik SQL Injection.

...

Sekarang mari kita lihat contoh bagaimana cara mengamankan secara cepat dan sederhana baris kode aplikasi di atas. Awas, ini bukan cara yang benar dan baik, tapi hanya sekedar contoh saja. Untuk mengatasi teknik serangan di atas, secara sederhana kita bisa menyaring input dari user, contohnya dengan menghapus karakter kutip dan karakter titik koma. Sekali lagi, jangan gunakan cara ini untuk aplikasi yang sebenarnya!
'variabel untuk mengambil input dari user
Dim strInput as String = ""

'ini adalah proses penyaringan input, yakni menghapus karakter kutip dan titik koma
strInput = strInput.Replace("'", "")
strInput = strInput.Replace(";", "")

'variable yang berisi format perintah SQL yang akan dikirim ke server DBMS
'perhatikan bahwa input dari user sudah disaring dari atas
Dim strCommand as String = "SELECT * FROM TablePegawai WHERE Nama = '" & strInput & "';"

'baris-baris berikut adalah untuk melakukan koneksi ke server DBMS dan mengirim perintah yang dibuat tadi ke DBMS
Dim objConnection as New SqlConnection
Dim objCommand as New SqlCommand(objConnection, strCommand)
objCommand.Execute()

Maka kembali lagi, ketika user dengan SQL Injection tadi mengetikkan input yang sama seperti diatas tadi, perintah SQL yang akan dikirim aplikasi ke server DBMS jadinya seperti berikut:
SELECT * FROM TablePegawai WHERE Nama = 'budi selamat delete from tablepegawai where nama = budi selamat';

Disini tampak bahwa perintah SQL-nya sudah sah dan benar dan walau pun kelihatan seperti panjang namun hanya terdiri satu query. Perintah ini berniat akan menampilkan data pegawai dari tabel Pegawai yang bernama "budi selamat delete from tabelpegawai where nama = budi selamat". Kemungkinan besar tidak akan ada data yang ditampilkan karena pasti sangat jarang sekali ada pegawai yang namanya seperti itu! :)



Ouwhh yeaahh..!!



Jadi, teknik SQL Injection sangat bergantung pada adanya kelemahan pada aplikasi. Lha, kalau si pembuat aplikasinya sudah mengantisipasi teknik ini secara mendalam dan sudah menerapkan rutin-rutin penyaringan input dari user sebelum mengirim perintah ke database, apakah teknik ini akan tetap bisa berjalan? Ya enggak lah brouww..!!

Kembali ke tulisan publik yang saya sebut di atas tadi, kira-kira benarkah teknik SQL Injection yang disebut dalam tulisan itu (dilakukan oleh pakar IT? Ilmu Tipu?) bisa dilakukan ke aplikasi SPSE? Saya sih tidak tau pasti karena saya tidak terlibat dalam pengembangan aplikasi itu. Tapi sedikit logika saja mungkin bisa membantu memberi jawaban. Mungkinkan sebuah aplikasi yang digunakan secara nasional di 500 lebih daerah seluruh Indonesia yang dikembangkan sejak tahun 2008 lalu bisa luput dan lupa memuat baris-baris kode untuk menyaring input dari user sehingga bisa diserang dengan teknik SQL Injection-nya si Luthfi Setiawan alias Wawan, yakni salah satu penyedia jasa telco server terbesar di Indonesia? Heh! Bangun, bangun!



Pencuri yang jahat, pencuri yang baik, dan pencuri yang bodoh!



Hmm, okelah kita anggap saja dulu bisa. Anggap saja ternyata aplikasi yang sudah 8 tahun dikembangkan itu lupa menyaring input dari user sehingga bisa diserang dengan teknik SQL Injection. Secara kebetulan si Wawan inilah yang akhirnya menemukan celah kemanan itu pada Juni 2016 (setelah 8 tahun!). Lalu, tulisan itu melanjutkan klaimnya bahwa Wawan berhasil 'menanamkan backdoor yang berbasiskan bahasa pemrograman PHP yang bernama wso.php (web sell by orb)'. Hadeh! Ini mungkin alamat webshell dimaksud: https://github.com/HARDLINUX/webshell.

Lihat dulu. Dari uraian di atas nampak bahwa SQL Injection itu umumnya hanya berdampak pada Dabatase yang dikelola oleh DBMS. Jadi secara umum, tingkat kerusakan yang banyak terjadi oleh SQL Injection adalah rusaknya data pada Database, tapi tidak pada file system atau sistem operasi (Operating System, atau OS).

Memang benar bahwa dengan membuat konfigurasi khusus, sebuah DBMS bisa saja mengeksekusi perintah OS pada server, tapi ini sangat jarang dilakukan oleh seorang administrator DBMS! Jadi pertanyaannya, bagaimanakah caranya si jenius Wawan bisa menanamkan backdoor webshell tersebut ketika konfigurasi DBMS sudah jelas tidak memberikan ijin eksekusi perintah yang berhubungan dengan file system atau operating system?

Ah, sudahlah. Mari kita anggap saja lagi bahwa DBMS yang digunakan oleh aplikasi SPSE ternyata ada kesalahan dalam konfigurasinya yang membuat teknik SQL Injection-nya Wawan bisa menjalankan perintah operating system untuk menanamkan backdoor. Atau mungkin diam-diam Wawan secara kreatif berhasil menggunakan SQL Injection untuk mem-bypass sistim otentikasi pada aplikasi dan melakukan user impersonation, tapi dia tidak membeberkannya (hehehe).

Lalu apa? Wawan mengerahkan semua kemampuan hebatnya untuk menjalankan ini semua hanya untuk mencari tahu dan mendapatkan informasi bahwa ada pengurangan besaran kapasitas jaringan internet atau pengurangan bandwidth?

Ilustrasinya begini. Ada sebuah rumah mewah yang didalamnya banyak sekali harta yang bisa dicuri. Rumah ini dijaga ketat dengan suatu sistim elektronik dan terkomputerisasi (dengan cctv, alarm pencuri, sensor gerakan, dll). Lalu ada pencuri handal yang bernama Luthfi Setiawan alias Wawan. Dengan segenap kemampuannya dia akhirnya berhasil melakukan bypass terhadap semua sistem keamanan yang telah dibuat di rumah itu dan dia berhasil masuk ke dalam rumah dan melihat atau bahkan meraba-raba semua emas yang ada di dalam rumah. Lalu dia tiba-tiba dia keluar. Berjalan pelan menuju kantor berita terdekat di sekitar rumah itu dan menemui seorang wartawan dan menceritakan pengalamannya. Kepada wartawan, Wawan memberikan kesimpulan yang sangat menggemparkan orang-orang di daerahnya, yakni: "ternyata lebar daun pintu rumah itu tidak selebar daun pintu rumah para tetangga di sekitarnya!"

Kopi..! Mana kopiii...!!!

Tidak ada komentar :

Posting Komentar