Menguji Kerentanan SQL Injection

Serangan SQL Injection menimbulkan risiko yang luar biasa terhadap aplikasi web yang bergantung pada backend basis data untuk menghasilkan konten dinamis. Dalam jenis serangan ini, peretas memanipulasi aplikasi web dalam upaya menyuntikkan perintah SQL mereka sendiri ke dalam yang dikeluarkan oleh database. Sebagai contoh, lihat artikel Serangan SQL Injection pada Databases. Dalam artikel ini, kami melihat beberapa cara Anda dapat menguji aplikasi web Anda untuk menentukan apakah mereka rentan terhadap serangan SQL Injection.

Pemindaian Otomatis SQL Injection

Salah satu kemungkinan adalah menggunakan pemindai kerentanan aplikasi web otomatis, seperti WebInspect HP, AppScan IBM, atau Hailstorm Cenzic. Semua alat ini menawarkan cara yang mudah dan otomatis untuk menganalisis aplikasi web Anda untuk potensi kerentanan SQL Injection. Namun, mereka cukup mahal, berjalan hingga $ 25.000 per kursi.

Uji Injeksi SQL Manual

Apa yang harus dilakukan oleh pengembang aplikasi yang buruk? Anda benar-benar dapat menjalankan beberapa tes dasar untuk mengevaluasi aplikasi web Anda untuk kerentanan SQL Injection menggunakan tidak lebih dari browser web. Pertama, kata peringatan: tes yang saya jelaskan hanya mencari kelemahan SQL Injection dasar. Mereka tidak akan mendeteksi teknik-teknik canggih dan agak membosankan untuk digunakan. Jika Anda mampu membelinya, gunakan pemindai otomatis. Namun, jika Anda tidak bisa menangani label harga itu, pengujian manual adalah langkah pertama yang bagus.

Cara termudah untuk mengevaluasi apakah suatu aplikasi rentan adalah bereksperimen dengan serangan injeksi tidak berbahaya yang tidak akan membahayakan database Anda jika mereka berhasil tetapi akan memberi Anda bukti bahwa Anda perlu memperbaiki masalah. Misalnya, Anda memiliki aplikasi web sederhana yang mencari individu di database dan memberikan informasi kontak sebagai hasilnya. Halaman itu mungkin menggunakan format URL berikut:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike

Kita dapat mengasumsikan bahwa halaman ini melakukan pencarian basis data, menggunakan kueri yang serupa dengan yang berikut:

PILIH telepon DARI direktori WHERE lastname = 'chapple' dan firstname = 'mike'

Mari bereksperimen dengan ini sedikit. Dengan asumsi kami di atas, kita dapat membuat perubahan sederhana ke URL yang menguji serangan injeksi SQL:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike'+AND+(select+count(*)+from+fake)+%3e0+OR+'1'%3d'1

Jika aplikasi web belum dilindungi dengan benar terhadap injeksi SQL, cukup colokkan nama depan palsu ini ke dalam pernyataan SQL yang dijalankannya terhadap database, sehingga:

PILIH telepon DARI direktori WHERE lastname = 'chapple' dan firstname = 'mike' AND (pilih count (*) dari fake)> 0 ATAU '1' = '1'

Anda akan melihat bahwa sintaks di atas sedikit berbeda dari yang ada di URL asli. Saya mengambil kebebasan mengkonversi variabel yang dienkode-URL untuk persamaan ASCII mereka agar lebih mudah mengikuti contoh. Misalnya,% 3d adalah pengkodean URL untuk karakter '='. Saya juga menambahkan beberapa jeda baris untuk tujuan serupa.

Mengevaluasi Hasil

Tes datang ketika Anda mencoba memuat halaman web dengan URL yang tercantum di atas. Jika aplikasi web berperilaku baik, maka akan menghapus tanda kutip tunggal dari input sebelum meneruskan query ke database. Ini hanya akan menghasilkan pencarian yang aneh untuk seseorang dengan nama pertama yang mencakup sekelompok SQL! Anda akan melihat pesan kesalahan dari aplikasi yang serupa dengan yang di bawah ini:

Kesalahan: Tidak ditemukan pengguna dengan nama mike + DAN + (pilih + count (*) + dari + palsu) +% 3e0 + ATAU + 1% 3d1 Chapple!

Di sisi lain, jika aplikasi rentan terhadap injeksi SQL, itu akan melewati pernyataan langsung ke database, menghasilkan salah satu dari dua kemungkinan. Pertama, jika server Anda memiliki pesan kesalahan mendetail yang diaktifkan (yang tidak seharusnya Anda lakukan!), Anda akan melihat sesuatu seperti ini:

Penyedia Microsoft OLE DB untuk ODBC Drivers error '80040e37' [Microsoft] [ODBC SQL Server Driver] [SQL Server] Nama objek tidak valid 'palsu'. /direktori.asp, baris 13

Di sisi lain, jika server web Anda tidak menampilkan pesan kesalahan mendetail, Anda akan mendapatkan kesalahan yang lebih umum, seperti:

Kesalahan Server Internal Server mengalami kesalahan internal atau salah konfigurasi dan tidak dapat menyelesaikan permintaan Anda. Harap hubungi administrator server untuk memberi tahu waktu terjadinya kesalahan dan apa pun yang telah Anda lakukan yang mungkin menyebabkan kesalahan. Informasi lebih lanjut tentang kesalahan ini mungkin tersedia di log kesalahan server.

Jika Anda menerima salah satu dari dua kesalahan di atas, aplikasi Anda rentan terhadap serangan injeksi SQL! Beberapa langkah yang dapat Anda ambil untuk melindungi aplikasi Anda terhadap serangan SQL Injection meliputi: