Keamanan

Tutorial Teknik Injeksi SQL Buta

Tutorial Teknik Injeksi SQL Buta

Apa itu Injeksi SQL??

SQL Injection adalah jenis serangan database di mana penyerang mencoba mencuri informasi dari database aplikasi web application. Ini bahkan dapat mengakibatkan eksekusi kode jarak jauh tergantung pada lingkungan aplikasi web dan versi database.

SQL Injection terjadi karena sanitasi input pengguna yang buruk. Jika Anda mengambil input dari pengguna dalam beberapa bahasa pengkodean (PHP, ASP.NET) dan meneruskannya langsung ke database server tanpa menerapkan filter apa pun pada input, ini dapat mengakibatkan kerentanan SQL Injection.

Misalnya, kode PHP berikut ini rentan terhadap serangan SQL Injection karena langsung meneruskan input pengguna ke database. Penyerang dapat membuat kueri basis data berbahayanya sendiri untuk mengekstrak data dari basis data.

// Input pengguna disimpan dalam variabel id
$id = $_GET['id'];
// Input pengguna langsung dieksekusi di database
$getid = "PILIH first_name, last_name FROM users WHERE user_id = '$id'";
// Jika terjadi kesalahan atau sukses, hasilnya dikembalikan ke pengguna
$hasil = mysql_query($getid) atau die('
' . mysql_error() . '
');
$jumlah = mysql_numrows($hasil);

Di sisi lain, contoh kode aman dari kode tersebut untuk berinteraksi dengan database diberikan. Dibutuhkan input pengguna dan menyaring karakter jahat apa pun darinya, lalu meneruskannya ke database.

$id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id);

Injeksi SQL Normal vs Buta

Injeksi SQL Biasa

Dalam SQL Injection normal, jika penyerang mencoba memasukkan tanda kutip tunggal (') sebagai input, ketika tanda kutip tunggal ini dieksekusi di database, database merespons dengan kesalahan. Kesalahan dicetak di browser penyerang.

Kode yang bertanggung jawab atas kesalahan ini adalah

// jika basis data merespons dengan kesalahan, fungsi "atau mati ()" akan dijalankan
untuk mencetak kesalahan
$hasil = mysql_query($getid) atau die('
' . mysql_error() . '
');

Dalam Injeksi SQL Normal, penyerang dapat melihat hasil kesalahan dan mudah untuk mengidentifikasi dan mengeksploitasi.

Injeksi SQL Buta

Dalam kasus Blind SQL Injection, ketika permintaan berbahaya seperti kutipan tunggal dieksekusi, kesalahan basis data tidak ditampilkan di browser penyerang atau ditampilkan dengan cara yang sangat umum yang tidak dapat diidentifikasi dan dieksploitasi dengan mudah oleh penyerang.

Kode backend yang bertanggung jawab untuk ini diberikan di bawah ini

$hasil = mysql_query($getid); // Menghapus 'atau mati' untuk menekan kesalahan mysql

Dalam Blind SQL Injection, penyerang tidak dapat melihat hasil yang lengkap, sehingga jenis SQLi ini sulit untuk diidentifikasi dan dieksploitasi tetapi memiliki tingkat risiko yang sama dengan SQLi biasa.

Teknik Mendeteksi Blind SQL Injection

Sementara SQL Injection normal dapat dideteksi dengan mengirimkan tanda kutip tunggal (') sebagai input dan memeriksa kesalahan output, injeksi SQL Blind tidak dapat dideteksi menggunakan teknik ini karena tidak menampilkan kesalahan SQL apa pun. Ada banyak teknik untuk mendeteksi injeksi Blind SQL, beberapa di antaranya diberikan sebagai berikut:

Deteksi berbasis BENAR dan SALAH

Salah satu karakteristik Database termasuk MySQL adalah perilaku yang berbeda pada pernyataan Benar dan Salah. Bahkan jika database tidak menunjukkan kesalahan apapun, kita dapat memutuskan menggunakan penggunaan pernyataan Benar dan Salah. Pertimbangkan skenario berikut,

Halaman berikut rentan terhadap injeksi Blind SQL, memberikan pernyataan yang benar akan menampilkan semua entri dalam database

1' atau 1=1#

Memberikan kueri Salah sebagai input tidak akan menampilkan data apa pun.

1' atau 1=2#

Bahkan halaman web tidak menunjukkan kesalahan apa pun, perbedaan antara dua halaman menunjukkan bahwa kueri kami berhasil dieksekusi di database.

Deteksi berbasis WAKTU

Ada fungsi dalam database termasuk MySQL, MS-SQL dan lainnya untuk penundaan. Kami dapat menggunakan fungsi SLEEP() dalam kueri kami, jika respons basis data lambat itu berarti kueri kami berhasil dieksekusi dan halaman web rentan terhadap Blind SQL Injection.

1' DAN tidur(15)#

Ada fungsi lain yang memakan waktu "BENCHMARK" yang dapat digunakan untuk menunda respons basis data

1' DAN BENCHMARK(10000000,SHA1(1337))#

Baris di atas akan menjalankan fungsi SHA1() 10000000 kali dalam database, yang akan menambah jumlah penundaan yang signifikan dalam respons.

Injeksi SQL Buta berbasis waktu di database lain

MS SQL: ID=1;tunggu penundaan '0:0:10'-

ORACLE SQL: DAN [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])

PostgreSQL : DAN [RANDNUM]=(PILIH [RANDNUM] DARI PG_SLEEP([SLEEPTIME]))

SQLite : DAN [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))

Mengekstrak Informasi Basis Data

Langkah pertama mengekstrak database adalah menentukan nomor kolom dalam database. Kemudian coba temukan kolom yang rentan untuk mengekstrak data lebih lanjut.

Blind SQL Injection berperilaku berbeda dengan nomor kolom yang berbeda dalam kueri "urutkan berdasarkan".

1' pesan dengan 1#

Pernyataan di atas benar karena setidaknya 1 kolom selalu ada dalam database. Sekarang coba dengan jumlah yang sangat besar.

1' pesan 10000#

Respons basis data berbeda dari yang sebelumnya. Sekarang coba dengan 2 kolom.

Pernyataan berhasil, itu berarti database memiliki 2 kolom atau lebih more. Sekarang coba dengan 3 kolom.

1' pesan dengan 3#

Basis data belum mengirim respons apa pun, itu berarti basis data hanya memiliki 2 kolom. Sekarang kita akan mencoba untuk membuang daftar tabel dalam database, kita akan menggunakan query berikut untuk itu:

1' union semua pilih 1,group_concat(table_name) dari information_schema.
tabel di mana table_schema=database()#

Ada dua tabel di database backend “buku tamu & pengguna”. Tabel "pengguna" dapat berisi nama pengguna dan kata sandi. Untuk mengekstrak nama kolom dari tabel, masukkan kueri berikut:.

1' union semua pilih 1,group_concat(column_name) dari information_schema.
kolom di mana table_schema=database()#

Sekarang kami telah mengekstrak nama kolom, ini termasuk kolom pengguna dan kata sandi. Kolom ini menyimpan nama pengguna dan kata sandi pelanggan.

Sekarang kita akan mencoba mengekstrak data menggunakan query berikut:

1' union semua pilih 1,group_concat(user,password) dari users#

Dan begitulah cara Anda dapat mengeksploitasi Blind SQL Injection tanpa bergantung pada kesalahan. Kata sandi keluaran sebagian besar waktu di-hash, yang dapat didekripsi menggunakan alat seperti John The Ripper atau Hashcat.

Kesimpulan:

Blind SQL Injection adalah jenis SQLi yang tidak menunjukkan kesalahan basis data atau merespons dengan pesan yang sangat umum. Itulah mengapa sangat sulit untuk mengidentifikasi kerentanan Blind SQL Injection di halaman web. Setelah terdeteksi, Anda dapat memanfaatkannya dengan mudah dengan proses manual atau otomatis menggunakan SQLmap.

Cara Mengembangkan Game di Linux
Satu dekade yang lalu, tidak banyak pengguna Linux yang memprediksi bahwa sistem operasi favorit mereka suatu hari nanti akan menjadi platform game po...
Port Sumber Terbuka dari Mesin Game Komersial
Rekreasi mesin game gratis, open source, dan lintas platform dapat digunakan untuk bermain lama serta beberapa judul game yang cukup baru. Artikel ini...
Game Baris Perintah Terbaik untuk Linux
Baris perintah bukan hanya sekutu terbesar Anda saat menggunakan Linux-ini juga dapat menjadi sumber hiburan karena Anda dapat menggunakannya untuk me...