Minggu lalu saya membuat situs web untuk orang lain, dan saya tidak sengaja menemukan banyak celah dalam pekerjaan saya hanya dalam 20 detik, saya menggunakan injeksi SQL untuk memperbaikinya. Jadi saya memeriksa beberapa informasi tentang injeksi sql dan mendapatkan beberapa wawasan. Saya harap saya dapat membaginya dengan pemula. Para ahli tertawa!
Ide umum serangan injeksi SQL:
Temukan lokasi injeksi SQL;
Tentukan tipe server dan tipe database latar belakang;
Untuk menentukan executabilitas
, beberapa penyerang umumnya menggunakan injeksi SQL. Selanjutnya, saya juga akan berbicara tentang wawasan saya sendiri tentang metode injeksi sql.
Metode injeksi:
Secara teori, halaman web otentikasi akan terlihat seperti ini:
Pilih * dari admin di mana pernyataan nama pengguna='XXX' dan kata sandi='YYY', jika pemfilteran karakter yang diperlukan tidak dilakukan sebelum menjalankan pernyataan ini secara resmi, maka mudah untuk mengimplementasikan injeksi SQL.
Misalnya, masukkan di kotak teks nama pengguna: abc' atau 1=1-- Masukkan di kotak kata sandi: 123, maka pernyataan SQL menjadi:
pilih * dari admin di mana nama pengguna='abc' atau 1=1 dan kata sandi='123' Apa pun nama pengguna dan kata sandi yang dimasukkan pengguna, pernyataan ini akan selalu dijalankan dengan benar, dan pengguna dapat dengan mudah menipu sistem dan mendapatkan izin hukum identitas.
Coba tebak solusinya:
Ide dasarnya adalah: menebak semua nama database, menebak setiap nama tabel dalam database, menganalisis nama tabel yang dapat menyimpan nama pengguna dan kata sandi, menebak setiap nama field dalam tabel, menebak setiap record dalam isi tabel.
Ada juga cara untuk mendapatkan nama database Anda dan nama setiap tabel.
Dapatkan saja nama database dan nama tabel Anda dengan melaporkan kesalahan dalam formulir: http://www .cn/news?id=10'!
Untuk jsp, kami biasanya mengadopsi strategi berikut untuk menghadapinya:
1.Pernyataan yang Disiapkan
Jika Anda sudah menjadi pengembang yang cukup mahir, Anda harus selalu menggunakan PreparedStatement, bukan Statement.
Berikut beberapa alasannya
1. Keterbacaan dan pemeliharaan kode.
2. PreparedStatement meningkatkan kinerja sebanyak mungkin.
3. Hal yang paling penting adalah keamanan ditingkatkan secara signifikan.
Sejauh ini, beberapa orang (termasuk saya sendiri) bahkan tidak mengetahui dasar sintaksis SQL yang jahat.
String sql = "pilih * dari tb_name di mana nama= '"+varname+"' dan passwd='"+varpasswd+"'";
Jika kita meneruskan [' atau '1' = '1] sebagai nama. Kata sandinya sewenang-wenang, mari kita lihat seperti apa jadinya? Jaringan manajemen jaringan bitsCN.com
pilih * dari tb_name = 'atau '1' = '1' dan passwd = 'biasa';
Karena '1'='1' benar, maka dapat lolos verifikasi apa pun.
Lewati ['; jatuhkan tabel tb_name; ] sebagai varpasswd, lalu:
pilih * dari tb_name = 'any' dan passwd = ''; drop table tb_name; Beberapa database tidak akan membiarkan Anda berhasil, tetapi ada juga banyak database yang dapat menjalankan pernyataan ini.
Dan jika Anda menggunakan pernyataan yang telah dikompilasi sebelumnya, konten apa pun yang Anda berikan tidak akan memiliki hubungan yang cocok dengan pernyataan asli (Premisnya adalah bahwa database itu sendiri mendukung prakompilasi, tetapi mungkin tidak ada database sisi server yang tidak mendukung kompilasi. Di sana hanya beberapa database desktop, yaitu database yang memiliki akses file langsung. Selama semuanya menggunakan pernyataan yang telah dikompilasi, Anda tidak perlu melakukan pemfilteran apa pun pada data yang masuk banyak waktu yang terbuang,;, dll. Merencanakan penilaian dan berpikir berlebihan.
2. Ekspresi reguler
2.1. Ekspresi reguler untuk mendeteksi meta-karakter SQL/(%27)|(')|(--)|(%23)|(#)/ix
2.2. Perbaiki ekspresi reguler untuk mendeteksi meta-karakter SQL /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne. com
|(%3B)|(:))/i
2.3. Ekspresi reguler serangan injeksi SQL yang khas/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |( Aliansi Manajemen Jaringan Tiongkok www.bitscn.com
%52))/ix
2.4. Mendeteksi injeksi SQL, ekspresi reguler kata kunci kueri UNION /((%27)|('))union/ix(%27)|(') - tunggal
Kutipan dan gabungan hex yang setara - kata kunci gabungan.
2.5. Ekspresi reguler/exec(s|+)+(s|x)pw+/ix untuk mendeteksi serangan injeksi SQL MS SQL Server
3. Pemfilteran string
Konten filter String statis publik(Konten string){
String flt="'|dan|exec|masukkan|pilih|hapus|perbarui|hitung|*|%
|chr|mid|master|truncate|char|deklarasikan|;
Stringfilter[] = flt.split("|");
untuk(int saya=0; saya {
konten.ganti(filter[i], "");
}
mengembalikan konten;
}
4. Penyembunyian karakter yang tidak aman
Bagian ini menggunakan js untuk memblokir, yang memainkan peran yang sangat kecil. Meskipun metode pemblokiran kata kunci memiliki efek tertentu, dalam aplikasi sebenarnya, kata kunci SQL ini juga dapat menjadi kata kunci kueri yang sebenarnya, dan kemudian akan diblokir oleh Anda pengguna tidak akan dapat menggunakannya secara normal. Berusahalah untuk menerapkan standar pengkodean.
Jika ada variabel dalam SQL yang dieksekusi, gunakan saja PreparedStatement yang disediakan oleh JDBC (atau lapisan persistensi data lainnya). Ingatlah untuk tidak menggunakan metode penyambungan string.
Pengenalan fungsi: Periksa apakah berisi "'", " ","/ "
Deskripsi parameter: String yang akan diperiksa Nilai kembalian: 0: Ya 1: Bukan Nama fungsi Ya
pemeriksaan fungsi (a)
{
kembali 1;
fibdn = Array baru ("'" ," \","/ ");
i=fibdn.panjang;
j=a.panjang;
untuk (ii=0; ii { untuk (jj=0; jj
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
jika (tem'; p1==temp2)
{ kembali 0; }
}
}
kembali 1;
}