Tutorial Teknik Injeksi SQL Buta:

SQL Injection adalah jenis serangan basis data di mana penyerang mencoba mencuri informasi dari basis data aplikasi web. Ini bahkan dapat menyebabkan eksekusi kode jarak jauh bergantung pada lingkungan aplikasi web dan versi database.

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

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

// Input pengguna disimpan dalam variabel id
$id = $_GET(‘id’);

// Akses pengguna dilakukan langsung di database
$getid = “PILIH nama depan, nama belakang DARI pengguna MANA user_id = ‘$id'”;

// Saat error atau berhasil, hasilnya dikembalikan ke pengguna
$hasil = mysql_query($getid) atau mati(‘

' . mysql_error() . '

‘ );
$jumlah = mysql_numrows($hasil);

Di sisi lain, contoh kode yang aman dari kode tersebut untuk berinteraksi dengan database disediakan. Dibutuhkan input pengguna dan memfilter karakter jahat apa pun darinya dan kemudian meneruskannya ke database.

$id = $_GET(‘id’);
$id = garis miring ($id);
$id = mysql_real_escape_string ($id);

Injeksi SQL normal vs buta

Injeksi SQL biasa

Dalam Injeksi SQL normal, jika penyerang mencoba memasukkan tanda kutip tunggal (‘) sebagai input saat tanda kutip tunggal ini dijalankan di database, database akan merespons dengan kesalahan. Kesalahan dicetak di browser penyerang.

Kode yang bertanggung jawab atas kesalahan ini

// jika database merespon dengan error, fungsi “or die()” akan dieksekusi
untuk mencetak kesalahan

$hasil = mysql_query($getid) atau mati(‘

' . mysql_error() . '

‘ );

Dalam Injeksi SQL Normal, penyerang dapat melihat hasil kesalahan, yang mudah diidentifikasi dan dieksploitasi.

Injeksi SQL buta

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

Kode backend yang bertanggung jawab untuk ini diberikan di bawah ini

$hasil = mysql_query( $getid ); // Dihapus “atau mati” untuk menekan kesalahan mysql

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

Teknik Deteksi Blind SQL Injection

Sementara injeksi SQL reguler dapat dideteksi dengan mengirimkan tanda kutip tunggal (‘) sebagai input dan memeriksa output kesalahan, injeksi Blind SQL tidak dapat dideteksi menggunakan teknik ini karena tidak menampilkan kesalahan SQL apa pun. Ada banyak metode untuk mendeteksi injeksi SQL buta, beberapa di antaranya diberikan di bawah ini

Deteksi berbasis BENAR dan SALAH

Salah satu karakteristik basis data, termasuk MySQL, adalah perilaku pernyataan Benar dan Salah yang berbeda. Bahkan jika basis data tidak menunjukkan kesalahan apa pun, kita dapat menentukannya menggunakan pernyataan Benar dan Salah. Pertimbangkan skenario berikut.

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

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

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

Deteksi berbasis WAKTU

Basis data termasuk MySQL, MS-SQL, dll. Memiliki fitur penundaan. Kita dapat menggunakan fungsi SLEEP() pada query kita, jika respon dari database lambat, berarti query kita berhasil dan halaman web rentan terhadap Blind SQL Injection.

Ada fungsi BENCHMARK lain yang memakan waktu yang dapat digunakan untuk menunda respons database

1′ DAN benchmark(10000000,SHA1(1337))#

Baris di atas akan menjalankan fungsi SHA1() 10.000.000 kali pada database, yang akan menambah penundaan respons yang signifikan.

Blind SQL Injection berbasis waktu ke database lain

MS SQL: ID=1; tunggu tunda “0:0:10” –

SQL ORACLE: DAN (RANDNUM)=DBMS_PIPE.RECEIVE_MESSAGE(‘(RANDSTR)’, (WAKTU TIDUR))

PostgreSQL: AND (RANDNUM)=(PILIH (RANDNUM) DARI PG_SLEEP ((SLEEPTIME)))

SQLite: DAN (RANDNUM)=SEPERTI(‘ABCDEFG’,UPPER(HEX(RANDOMBLOB((WAKTU TIDUR)00000000/2))))

Ekstraksi informasi basis data

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

Blind SQL Injection menangani nomor kolom yang berbeda secara berbeda dalam kueri “berurutan”.

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

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

Pernyataan berhasil, artinya database memiliki 2 kolom atau lebih. Sekarang coba dengan 3 kolom.

Basis data tidak mengirimkan respons apa pun, mis. basis data hanya memiliki 2 kolom. Sekarang kami akan mencoba membuang daftar tabel ke dalam database, untuk ini kami akan menggunakan kueri berikut

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

Basis data backend memiliki dua tabel “buku tamu dan pengguna”. Tabel “Pengguna” dapat berisi nama pengguna dan kata sandi. Untuk mengekstrak nama kolom dari tabel, masukkan kueri berikut:

1′ di grup 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 nama pengguna dan kata sandi. Kolom ini menyimpan nama pengguna dan kata sandi pelanggan.

Sekarang kami akan mencoba mengekstrak data menggunakan kueri berikut

1′ di grup semua pilih 1,group_concat(user,password) from users#

Sehingga Anda dapat menggunakan Blind SQL Injection tanpa bergantung pada bug. Kata sandi keluar sebagian besar waktu disebutkan, yang dapat dipecahkan menggunakan alat seperti John The Ripper atau Hashcat.

Kesimpulan:

Blind SQL Injection adalah jenis SQLi yang tidak menampilkan kesalahan basis data atau merespons dengan pesan yang sangat umum. Untuk alasan ini, sangat sulit untuk mendeteksi kerentanan Blind SQL Injection pada halaman web. Setelah terdeteksi, Anda dapat dengan mudah menggunakannya secara manual atau dalam proses otomatis menggunakan SQLmap.

Source link