Keselamatan

Tutorial Teknik Suntikan SQL Buta

Tutorial Teknik Suntikan SQL Buta

Apa itu SQL Injection?

SQL Injection adalah jenis serangan pangkalan data di mana penyerang cuba mencuri maklumat dari pangkalan data aplikasi web. Ini bahkan boleh mengakibatkan pelaksanaan kod jarak jauh bergantung pada lingkungan aplikasi web dan versi pangkalan data.

SQL Injection berlaku kerana pembersihan input pengguna yang buruk. Sekiranya anda mengambil input dari pengguna dalam beberapa bahasa pengekodan (PHP, ASP.BERSIH) dan teruskan ke pangkalan data pelayan tanpa menggunakan penapis pada input, ini boleh menyebabkan kerentanan SQL Injection.

Sebagai contoh, kod PHP berikut rentan terhadap serangan SQL Injection kerana secara langsung menyebarkan input pengguna ke pangkalan data. Attacker dapat membuat pertanyaan pangkalan data jahat sendiri untuk mengekstrak data dari pangkalan data.

// Input pengguna disimpan dalam pemboleh ubah id
$ id = $ _GET ['id'];
// Input pengguna dilaksanakan secara langsung dalam pangkalan data
$ getid = "SELECT first_name, last_name DARI pengguna DI MANA user_id = '$ id'";
// Sekiranya berlaku kesilapan atau kejayaan, hasilnya dikembalikan kepada pengguna
$ hasil = mysql_query ($ getid) atau mati ('
' . mysql_error () . '
');
$ num = mysql_numrows (hasil $);

Sebaliknya, contoh kod selamat dari kod tersebut untuk berinteraksi dengan pangkalan data diberikan. Ia memerlukan input pengguna dan menyaring sebarang watak jahat daripadanya, lalu menyebarkannya ke pangkalan data.

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

Suntikan SQL Normal vs Blind

Suntikan SQL Biasa

Dalam SQL Suntikan biasa, jika penyerang cuba memasukkan satu kutipan (') sebagai input, ketika kutipan tunggal ini dijalankan dalam pangkalan data, pangkalan data merespon dengan kesalahan. Kesalahan dicetak pada penyemak imbas penyerang.

Kod yang bertanggungjawab untuk ralat ini adalah

// jika pangkalan data bertindak balas dengan ralat, fungsi "atau mati ()" dijalankan
untuk mencetak ralat
$ hasil = mysql_query ($ getid) atau mati ('
' . mysql_error () . '
');

Dalam SQL Suntikan Normal, penyerang dapat melihat hasil ralat dan mudah dikenali dan dieksploitasi.

Suntikan SQL Buta

Dalam kes Blind SQL Injection, apabila pertanyaan jahat seperti kutipan tunggal dijalankan, kesalahan pangkalan data tidak ditampilkan pada penyemak imbas penyerang atau ia ditampilkan dengan cara yang sangat umum yang tidak dapat dikenali dan dieksploitasi dengan mudah oleh penyerang.

Kod backend yang bertanggungjawab untuk ini diberikan di bawah

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

Dalam Blind SQL Injection, penyerang tidak dapat melihat hasil yang lengkap, oleh itu jenis SQLi ini sukar dikenal pasti dan dieksploitasi tetapi mempunyai tahap risiko yang sama dengan SQLi biasa.

Teknik Mengesan Suntikan SQL Buta

Walaupun SQL Injection normal dapat dideteksi dengan mengirim kutipan tunggal (') sebagai input dan memeriksa kesalahan output, suntikan Blind SQL tidak dapat dideteksi menggunakan teknik ini kerana tidak menampilkan kesalahan SQL. Terdapat banyak teknik untuk mengesan suntikan Blind SQL, beberapa di antaranya diberikan sebagai berikut

Pengesanan berdasarkan BENAR dan SALAH

Salah satu ciri Pangkalan Data termasuk MySQL adalah tingkah laku yang berbeza pada pernyataan Betul dan Salah. Walaupun pangkalan data tidak menunjukkan sebarang kesalahan, kami dapat memutuskan penggunaan penyataan Betul dan Salah. Pertimbangkan senario berikut,

Halaman berikut rentan terhadap suntikan Blind SQL, memberikan pernyataan yang benar akan memaparkan semua entri dalam pangkalan data

1 'atau 1 = 1 #

Memberikan pertanyaan Salah sebagai input tidak akan memaparkan data.

1 'atau 1 = 2 #

Walaupun laman web tidak menunjukkan sebarang kesalahan, perbezaan antara dua halaman tersebut memberitahu bahawa pertanyaan kami berjaya dilaksanakan dalam pangkalan data.

Pengesanan berdasarkan MASA

Terdapat fungsi dalam pangkalan data termasuk MySQL, MS-SQL dan lain-lain untuk kelewatan. Kami dapat menggunakan fungsi SLEEP () dalam pertanyaan kami, jika respons pangkalan data lambat yang bermaksud permintaan kami berhasil dilaksanakan dan halaman web rentan terhadap Blind SQL Injection.

1 'DAN tidur (15) #

Ada fungsi lain yang memakan waktu "BENCHMARK" yang dapat digunakan untuk menunda tindak balas pangkalan data

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

Baris di atas akan melaksanakan fungsi SHA1 () 10000000 kali dalam pangkalan data, yang akan menambah jumlah kelewatan tindak balas.

Blind SQL Injection berdasarkan masa dalam pangkalan data lain

MS SQL: ID = 1; kelewatan menunggu '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] = SUKA ('ABCDEFG', UPPER (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2)))))

Mengambil Maklumat Pangkalan Data

Langkah pertama mengekstrak pangkalan data adalah menentukan nombor lajur dalam pangkalan data. Kemudian cuba cari lajur yang rentan untuk mengekstrak data lebih lanjut.

Blind SQL Injection berkelakuan berbeza dengan nombor lajur yang berbeza dalam pertanyaan "susun mengikut".

Pesanan 1 'dengan 1 #

Pernyataan di atas adalah benar kerana sekurang-kurangnya 1 lajur selalu ada dalam pangkalan data. Sekarang cuba dengan bilangan yang sangat banyak.

Pesanan 1 'dengan 10000 #

Respons pangkalan data berbeza dengan yang sebelumnya. Sekarang cuba dengan 2 lajur.

Pernyataan itu berfungsi, itu bermaksud pangkalan data mempunyai 2 atau lebih lajur. Sekarang cuba dengan 3 lajur.

Pesanan 1 'dengan 3 #

Pangkalan data belum menghantar sebarang respons, ini bermaksud pangkalan data mempunyai 2 lajur sahaja. Sekarang kita akan cuba membuang senarai jadual dalam pangkalan data, kita akan menggunakan pertanyaan berikut untuk itu

1 'kesatuan semua pilih 1, group_concat (table_name) dari information_schema.
jadual di mana table_schema = pangkalan data () #

Terdapat dua jadual dalam pangkalan data backend "buku tamu & pengguna". Jadual "pengguna" mungkin mengandungi nama pengguna dan kata laluan. Untuk mengekstrak nama lajur dari jadual, masukkan pertanyaan berikut.

1 'kesatuan semua pilih 1, group_concat (kolum_nama) dari information_schema.
lajur di mana table_schema = pangkalan data () #

Sekarang kami telah mengekstrak nama lajur, ini termasuk lajur pengguna dan kata laluan. Lajur ini menyimpan nama pengguna dan kata laluan mereka.

Sekarang kita akan cuba mengekstrak data menggunakan pertanyaan berikut

1 'kesatuan semua pilih 1, group_concat (pengguna, kata laluan) dari pengguna #

Dan itulah bagaimana anda dapat memanfaatkan Blind SQL Injection tanpa bergantung pada kesilapan. Kata laluan keluaran sering dicincang, yang boleh didekripsi menggunakan alat seperti John The Ripper atau Hashcat.

Kesimpulan:

Blind SQL Injection adalah jenis SQLi yang tidak menunjukkan kesalahan pangkalan data atau bertindak balas dengan mesej yang sangat umum. Itulah sebabnya sangat sukar untuk mengenal pasti kelemahan Blind SQL Injection dalam laman web. Setelah dikesan, anda boleh memanfaatkannya dengan mudah melalui proses manual atau automatik menggunakan SQLmap.

Port Sumber Terbuka Mesin Permainan Komersial
Rekreasi enjin permainan sumber terbuka dan bebas platform boleh digunakan untuk bermain lama dan juga beberapa tajuk permainan yang baru-baru ini. Ar...
Permainan Perintah Terbaik untuk Linux
Baris perintah bukan hanya sekutu terbesar anda ketika menggunakan Linux-ia juga dapat menjadi sumber hiburan kerana anda dapat menggunakannya untuk m...
Aplikasi Pemetaan Gamepad Terbaik untuk Linux
Sekiranya anda suka bermain permainan di Linux dengan gamepad dan bukannya sistem input papan kekunci dan tetikus biasa, ada beberapa aplikasi berguna...