Berbicara tentang pengkodean URL, Anda mungkin memikirkan kerentanan pengkodean URL N tahun yang lalu. Sayangnya saya dilahirkan di waktu yang salah. Ketika saya bersentuhan dengan Internet, celah tersebut sudah lama hilang.
Lebih dekat ke rumah, apa itu pengkodean URL? Lihatlah definisi yang saya salin dari Internet:
Kutipan: Pengkodean URL adalah format yang digunakan oleh browser untuk mengemas input formulir. Browser mendapatkan semua nama dan nilai dari formulir dan mengirimkannya ke server sebagai bagian dari URL atau secara terpisah, menggunakan pengkodean parameter nama/nilai (menghapus karakter yang tidak dapat dikirim, mengurutkan data, dll.). Dalam kedua kasus tersebut, format input formulir di sisi server terlihat seperti ini:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
Pengkodean URL mengikuti aturan berikut: Setiap pasangan nama/nilai dipisahkan dengan tanda ampersand; berasal dari bentuk yang dipisahkan oleh = karakter. Jika pengguna tidak memasukkan nilai untuk nama tersebut, nama tersebut akan tetap muncul, namun tanpa nilai. Karakter khusus apa pun (yaitu, yang bukan ASCII tujuh bit sederhana, seperti karakter Cina) akan dikodekan dalam heksadesimal dengan tanda persen %, termasuk tentu saja karakter khusus seperti =, &, dan %.
Haha lho, sebenarnya pengkodean URL adalah kode ASCII heksadesimal dari sebuah karakter. Namun, ada sedikit perubahan. Anda perlu menambahkan "%" di depannya. Misalnya, "", kode ASCII-nya adalah 92, dan nilai heksadesimal 92 adalah 5c, jadi pengkodean URL "" adalah . Lalu bagaimana dengan penyandian URL karakter Cina? Sederhana sekali, lihat contohnya: kode ascii "Hu" adalah -17670, heksadesimalnya adalah BAFA, dan pengkodean urlnya adalah "%BA%FA". Haha, Anda tahu cara mengubahnya.
Kami biasanya tidak menggunakan pengkodean URL, karena IE akan secara otomatis mengubah huruf non-numerik yang Anda masukkan ke bilah alamat menjadi pengkodean URL. Jadi untuk browser http://blog.csdn.net/l%61ke2 setara dengan http://blog.csdn.net/lake2 (perhatikan saya mengganti a dengan %61 di URL pertama). Haha, mungkin Anda ingat ada yang menyarankan untuk menambahkan "#" pada nama database agar tidak terdownload, karena IE akan mengabaikan huruf berikut ketika menemukan #. Metode crackingnya sangat sederhana - ganti # dengan pengkodean url #. Saya awalnya mencoba menggunakan pengkodean URL untuk menghindari pemeriksaan injeksi, tetapi gagal karena server akan mengubah pengkodean URL menjadi karakter.
Tunggu, sepertinya saya keluar topik, haha, maaf :)
SQL injection sangat populer sekarang, jadi beberapa orang telah menulis beberapa skrip anti-injeksi. Tentu saja idenya berbeda dan hasilnya sangat berbeda. Pembaca yang budiman, silakan lihat bagian kode ××SQL universal anti-injection asp versi di bawah ini.
Fy_Url=Permintaan.ServerVariables("QUERY_STRING")
Fy_a=pisah(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
Pada Kesalahan Lanjutkan Berikutnya
untuk Fy_x=0 hingga ubound(Fy_a)
Fy_Cs(Fy_x) = kiri(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Berikutnya
Untuk Fy_x=0 hingga ubound(Fy_Cs)
Jika Fy_Cs(Fy_x)<>"" Lalu
Jika Instr(LCase(Permintaan(Fy_Cs(Fy_x))),"dan")<>0 maka
Respon.Tulis "Terjadi kesalahan!"
Respon.Akhir
Akhiri Jika
Akhiri Jika
Berikutnya
Idenya adalah pertama-tama mendapatkan data yang dikirimkan, menggunakan "&" sebagai pembatas untuk mendapatkan dan memproses grup nama/nilai, lalu menentukan apakah nilai tersebut mengandung kata kunci yang ditentukan (untuk mempermudah di sini, saya hanya menyisakan "dan"). Kalau iya, itu suntikan.
Sekilas nilainya sudah dicek dan sepertinya tidak ada masalah. Haha iya, tidak ada masalah dengan nilai, tapi bagaimana dengan nama?
Nilai grup nama/nilainya berasal dari Request.ServerVariables("QUERY_STRING"), haha, maaf, ada yang tidak beres di sini. Request.ServerVariables("QUERY_STRING") adalah untuk mendapatkan string yang dikirimkan oleh klien. Pengkodean URL tidak akan otomatis dikonversi di sini. Haha, jika kita mengkodekan nama URL lalu mengirimkannya, haha, maka pemeriksaan dapat dilewati. Misalnya, jika parameternya adalah ph4nt0m=lake2 dan lis0, program dapat mendeteksinya saat ini; jika Anda mengirimkan %50h4nt0m=lake2 dan lis0 (pengkodean URL p), program akan menilai nilai %50h4nt0m, dan %50h4nt0m akan dikonversi ke ph4nt0m. , sehingga nilai %50h4nt0m kosong, sehingga melewati deteksi.
Tunggu, kenapa pengecekan bisa dilewati jika namanya tidak didekodekan tetapi nilainya tidak bisa dilewati? Karena nilai value diambil dari Request(Fy_Cs(Fy_x)), server akan mendekodekannya.
Bagaimana program ini dapat ditingkatkan? Selama Anda bisa mendapatkan data dekode yang dikirimkan oleh klien, cukup ubah pernyataan untuk mendapatkan nama menjadi Untuk Setiap SubmitName Dalam Permintaan.QueryString.
Haha, terima kasih atas kesabaran Anda membaca artikel saya^_^
danau2