Mengingat pengembangan ASP dapat menggunakan dua bahasa: vbs dan js, maka kode program dalam kedua bahasa tersebut disediakan di sini (versi bilingual? YY medium...) Satu kalimat terakhir yang bertele-tele, mesin yang saya gunakan untuk mengetik artikel ini tidak memiliki Lingkungan ASP, jadi kode yang diberikan belum diuji, dan saya minta maaf untuk itu. Jika Anda menemukan masalah dalam kode, silakan berkomentar~Saya memiliki kulit yang tebal~
1. Prinsip serangan
Spoofing cookie terutama mengeksploitasi praktik tidak aman dalam menyimpan informasi login pengguna dalam cookie oleh beberapa sistem manajemen pengguna di jaringan saat ini. Metode serangannya relatif sulit dibandingkan dengan kerentanan seperti kerentanan injeksi SQL, tetapi masih sangat bodoh.
Kita tahu bahwa sistem pengguna umum berdasarkan Cookies akan menyimpan setidaknya dua variabel dalam Cookies: nama pengguna dan tingkat pengguna, di mana nama pengguna adalah nama pengguna dan tingkat pengguna adalah tingkat pengguna. Saat browser kita mengakses halaman ASP, ia akan mengirimkan sesuatu seperti
DAPATKAN /.../file.asp HTTP 1.0
...
Cookie: nama pengguna=pengguna&tingkat pengguna=1
...
paket, maka selama kita mengetahui nama pengguna administrator dan nilai tingkat pengguna (diasumsikan masing-masing admin dan 5), kita dapat mengirimkan
DAPATKAN /.../file.asp HTTP 1.0
...
Cookie: nama pengguna=admin&tingkat pengguna=5
...
untuk mendapatkan hak administrator. Sangat sederhana bukan? Namun, sebelum kerentanan ini ditemukan, hampir semua sistem manajemen pengguna mengandalkan cookie.
2. Menyimpan informasi pengguna dengan aman
Karena Cookie tidak aman, dan kami harus menyimpan informasi login pengguna, di mana sebaiknya disimpan?
Kami memperhatikan bahwa di ASP, selain Cookies, ada juga Session yang dapat menyimpan informasi. Sesi disimpan di server dan tidak dapat diubah begitu saja oleh klien, sehingga memiliki keamanan yang sangat tinggi. Dengan cara ini, Anda dapat mengganti semua kode Cookies dengan Session.
3. Menyimpan informasi pengguna untuk waktu yang lama
Menggunakan Sesi untuk menyimpan informasi login pengguna, meskipun menghilangkan masalah penipuan Cookie, Sesi tidak dapat disimpan untuk waktu yang lama (Sesi default IIS berakhir 20 menit setelah pengguna berhenti merespons), sehingga metode penyimpanan hybrid Cookies + Sesi dijelaskan di bagian ini diproduksi.
Ada dua varian dari metode ini. Yang pertama adalah menyimpan nama pengguna dan kata sandi di Cookies. Ketika pengguna mengunjungi suatu halaman, Sesi dibaca terlebih dahulu. Jika ada konten, Sesi yang akan berlaku dibaca dan informasi yang disediakan dalam Cookie akan digunakan. Masuk secara tidak jelas dengan nama pengguna dan kata sandi Anda untuk menentukan apakah konten dalam cookie itu sah. Kode untuk mengimplementasikan metode ini adalah sebagai berikut:
kata kerja:
Copy kode kodenya sebagai berikut:
<%
Redupkan nama pengguna, kata sandi
nama pengguna = Sesi(nama pengguna)
jika nama pengguna = maka
' Tidak ada informasi login pengguna di Sesi
nama pengguna = Permintaan.Cookies(nama pengguna)
kata sandi = Permintaan.Cookies(kata sandi)
' Perhatikan bahwa nama pengguna dan kata sandi yang diperoleh dalam dua kalimat di atas harus dicegah dari kerentanan injeksi SQL (yaitu, tanda kutip tunggal disaring'), yang dihilangkan di sini.
jika nama pengguna = atau kata sandi = maka
'Pengguna belum login
...
kalau tidak
' Ini mengasumsikan bahwa objek conn dan rs telah dibuat
rs.Buka PILIH TOP 1 * DARI [pengguna] WHERE nama pengguna=' & nama pengguna & ' DAN kata sandi=' & kata sandi & ', samb, 1, 3
jika rs.eof maka
'Informasi dalam cookie itu ilegal
...
kalau tidak
'Informasi di dalam cookie adalah sah, login secara otomatis
Sesi(nama pengguna) = nama pengguna
...
berakhir jika
berakhir jika
kalau tidak
'Informasi pengguna sudah ada di Sesi, baca langsung
...
berakhir jika
%>
js:
Copy kode kodenya sebagai berikut:
<%
var nama pengguna, kata sandi;
nama pengguna = Sesi(nama pengguna) + ;
if (nama pengguna == || nama pengguna == tidak ditentukan) {
// Tidak ada informasi pengguna di Sesi
nama pengguna = Permintaan.Cookies(nama pengguna) + ;
kata sandi = Permintaan.Cookies(kata sandi) + ;
// Perhatikan bahwa nama pengguna dan kata sandi yang diperoleh dalam dua kalimat di atas harus mencegah kerentanan injeksi SQL (yaitu, menyaring tanda kutip tunggal '), yang dihilangkan di sini.
if (nama pengguna == || nama pengguna == tidak ditentukan || kata sandi == || kata sandi == tidak ditentukan) {
//Pengguna belum login
...
}
kalau tidak {
// Ini mengasumsikan bahwa objek conn dan rs telah dibuat
rs.Open(PILIH TOP 1 * DARI [pengguna] WHERE nama pengguna=' + nama pengguna + ' DAN kata sandi=' + kata sandi + ', samb, 1, 3);
jika (rs.eof) {
//Informasi dalam Cookies adalah ilegal
...
}
kalau tidak {
//Informasi dalam Cookies adalah legal, login secara otomatis
Sesi(nama pengguna) = nama pengguna + ;
...
}
}
}
kalau tidak {
// Informasi pengguna sudah ada di Session, baca langsung
...
}
%>
Namun, metode ini sangat tidak aman bagi pengguna karena browser akan mengirimkan Cookie setiap kali mereka mengunjungi halaman tersebut, dan setelah Cookie yang berisi kata sandi diperoleh oleh orang lain, akun pengguna akan dicuri. Untuk situasi ini, ada metode kedua, yaitu menambahkan bidang kode verifikasi di database informasi pengguna. Saat pengguna masuk, nilai verifikasi bilangan bulat panjang dibuat secara acak dan disimpan di bidang kode verifikasi, serta nama pengguna dan kode verifikasi ini. nilai ditambahkan. Simpan cookie, bukan kata sandi. Saat memverifikasi informasi pengguna di Cookie, hanya nama pengguna dan kode verifikasi yang diverifikasi. Keuntungan dari metode ini adalah meskipun cookie pengguna diperoleh oleh peretas, ia hanya dapat menggunakan kode verifikasi yang dibuat sementara untuk masuk, tetapi tidak dapat memperoleh kata sandi pengguna. Selama pengguna ini login menggunakan nama pengguna dan kata sandi lagi, nilai kode verifikasi akan berubah, dan peretas tidak akan dapat masuk melalui kode verifikasi asli.
Implementasi metode ini hanya memerlukan sedikit perubahan pada kode metode 1 di atas. Pertama, dalam program login Anda, Anda perlu menambahkan paragraf tempat informasi pengguna disimpan setelah verifikasi:
kata kerja:
Copy kode kodenya sebagai berikut:
<%
Respon.Cookies(kode verifikasi) = int(rnd * 2100000000)
%>
js:
Copy kode kodenya sebagai berikut:
<%
Response.Cookies(verifycode) = Math.floor(Math.random() * 2100000000);
%>
Kemudian, ubah verifikasi Cookies(kata sandi) menjadi verifikasi Cookies(kode verifikasi) pada kode verifikasi yang disediakan di atas.
4. Kesimpulan
Melalui analisis dan pemrosesan kami, kerentanan spoofing Cookie telah teratasi sepenuhnya. Sejak itu, program ASP kami menjadi lebih aman.