SQL INJECTION
Pengertian SQL
Sebelum kita masuk lebih dalam ke arah SQL Injection, kita perlu tahu terlebih dahulu apa itu SQL. SQL merupakan singkatan dari Structured Query Language yang merupakan bahasa pemrograman untuk mengakses dan memanipulasi database. Database atau basis data sendiri merupakan sekumpulan data yang dikelola sedemikian rupa dengan ketentuan-ketentuan tertentu sehingga menjadi data yang terorganisir. Setelah kita memahami apa itu SQL dan database, sekarang kita akan lanjut ke SQL Injection. SQL Injection adalah sebuah teknik penyerangan terhadap kelemahan atau celah yang dimiliki oleh SQL. Penyerangan tersebut memanfaatkan celah dimana user dapat menginputkan karakter apapun yang berarti user dapat memasukkan command atau query SQL dengan tujuan untuk mendapatkan informasi penting yang berada di dalam database, seperti data personal dari user lain, login sebagai user lain, atau bahkan sebagai admin.
Cara Kerja SQL Injection
SQL Injection memanfaatkan input yang tidak difilter oleh suatu website. Oleh karena itu, attacker dapat menginputkan tanda ‘ (petik satu) yang biasanya dimasukkan melalui input bar, seperti yang ada pada login page. Petik satu yang diinputkan akan merusak susunan atau syntax dari command atau query SQL. Misalnya terdapat command atau query SQL sebagai berikut:
uname = request.POST[‘username’]
passwd = request.POST[‘password’] sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’” database.execute(sql) |
Apabila attacker memasukkan petik satu ke dalam input bar password, maka nantinya petik satu akan masuk ke dalam variabel passwd dan akan digunakan oleh variabel sql untuk validasi login. Petik satu tersebut akan merubah query SQL menjadi seperti berikut:
SELECT id FROM users WHERE username=’username’ AND password=”’ |
Query tersebut akan menimbulkan error karena terdapat satu petik yang tidak ditutup dengan petik satu lainnya. Karena attacker dapat menginputkan petik satu, maka attacker dapat memasukkan validasi dimana program akan selalu memberikan nilai true dengan menggunakan query “ ‘ or 1=1 — ”. 1=1 akan selalu memberikan nilai true dan “–” merupakan tanda comment di SQL, yang digunakan untuk membuat query selanjutnya tidak digunakan. Apabila kita coba masukkan ke dalam query SQL di atas, maka akan jadi seperti ini:
SELECT id FROM users WHERE username=’username’ AND password=”or 1=1 –‘ |
Query di atas tidak akan menimbulkan error, karena petik satu yang sebelumnya tidak ditutup menjadi comment dengan menggunakan double dash “–”. Karena program akan memberikan nilai true, maka attacker dapat login menjadi user lain hanya dengan menggunakan SQL Injection sederhana.
Exploit SQL Injection
Setelah Mengetahui apa itu SQL dan cara kerja dari SQL Injection, sekarang kita lihat bagaimana sih contoh SQL Injection sederhana. Di sini, saya akan mempraktikkan cara menyelesaikan challenge picoCTF 2019 yang bernama “Irish-Name-Repo 3” yang dapat diakses di link berikut (http://2019shell1.picoctf.com:12271/).
Pada halaman utama web tersebut hanya ditemukan gambar-gambar dan sedikit text. Namun, ketika membuka menu, didapatkan sebuah pilihan yang menarik, yaitu “Admin Login”.
Ketika dibuka, terlihat sebuah form password untuk menjadi admin. Menarik sekali!
Pertama-tama, kita melakukan Inspect Element pada bagian form tersebut dan didapatkan hasil seperti berikut.
Dari form tersebut, didapat dua buah input yang dikirim ke dalam server. Pertama adalah password dan yang kedua adalah debug yang bernilai default 0. Menarik, kita coba ubah nilai debug menjadi 1 dan memasukkan password “test”.
Didapatkan hasil yang menarik, password awal kita “test” berubah menjadi “grfg”, sepertinya password tersebut telah dienkripsi dan terlihat SQL query-nya.
Kita coba masukkan password “abcdef” dan mengubah nilai debug menjadi 1 dan didapatkan hasil yang lebih jelas. Hasil enkripsi password menjadi “nopqrs” yang mana berurutan dan dapat disimpulkan bahwa enkripsi yang digunakan adalah ROT13 (menggeser input sebanyak 13 karakter).
Kita coba masukkan SQL Injection sederhana ‘ OR 1=1 —. Namun, sebelum melakukan injection, terlebih dahulu kita melakukan enkripsi ROT13 ke dalam SQL Injection kita sehingga menjadi ‘ BE 1=1 —. Kemudian, kita masukkan injection tersebut ke dalam form password dan mengubah nilai debug menjadi 1 sehingga didapatkan hasil sebagai berikut.
SQL Injection berhasil dilakukan dan kita sekarang berhasil menjadi admin.