Persyaratan: Saya baru-baru ini membaca dokumen Microsoft ASP.NET Core "Mencegah Serangan Pengalihan Terbuka di ASP.NET Core", yang secara kasar berartiPengembang harus memperhatikan jalur situs lokal saat melompat ke alamat panggilan balik untuk mencegah beberapa orang memalsukan alamat panggilan balik untuk serangan phishing secara jahat。 Pelajari kode dan bersiaplah untuk memindahkannya ke proyek MVC ASP.NET.
Saya ingat bahwa produsen besar memiliki kerentanan ini sebelumnya, dan beberapa orang menggunakannya untuk menguras lalu lintas dari QQ dan WeChat, sebagai berikut:
Mengeksploitasi kerentanan tersebut, beberapa alat obrolan tidak dapat mencegah pengguna mengklik tautan untuk mengakses konten situs web berbahaya karena kepercayaan mereka pada domain perusahaan besar.
Apa itu serangan pengalihan terbuka?
Aplikasi web sering mengarahkan pengguna ke halaman login saat mereka mengakses sumber daya yang memerlukan autentikasi. Pengalihan biasanya menyertakan parameter querystring returnUrl sehingga pengguna dapat kembali ke URL yang diminta semula setelah login berhasil. Setelah pengguna mengautentikasi, mereka akan dialihkan ke URL yang mereka minta semula.
Contoh serangan
Pengguna jahat dapat mengembangkan serangan yang dirancang untuk memberi pengguna jahat akses ke kredensial atau informasi sensitif pengguna. Untuk memulai serangan, pengguna jahat akan mengelabui pengguna agar mengklik link ke halaman landing situs Anda dan menambahkan nilai querystring returnUrl ke URL tersebut. untukcontoso.comMisalnya, aplikasi ada dihttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutBerisi halaman arahan. Serangan mengikuti langkah-langkah berikut:
- Pengguna mengklik tautan berbahaya kehttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(URL kedua adalah "contoso1.com", alih-alih "contoso.com”) 。
- Pengguna berhasil masuk.
- Pengguna diarahkan ke situshttp://contoso1.com/Account/LogOn(Situs berbahaya yang terlihat persis seperti yang asli).
- Pengguna masuk lagi (memberikan kredensial ke situs berbahaya) dan diarahkan kembali ke situs asli.
- Pengguna mungkin berpikir bahwa upaya login pertama mereka gagal dan upaya kedua berhasil.Kemungkinan pengguna masih belum tahu bahwa kredensial mereka telah disusupi。
Selain halaman arahan, beberapa situs menawarkan halaman pengalihan atau titik akhir. Katakanlah aplikasi Anda memiliki halaman yang menyertakan pengalihan terbuka, /Home/Redirect. Misalnya, penyerang dapat membuat titik dalam email[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Logintautan. Pengguna biasa akan melihat bahwa URL dimulai dengan nama situs Anda. Karena kepercayaan, mereka mengklik tautan. Buka pengalihan lalu arahkan pengguna ke situs phishing yang terlihat sama dengan milik Anda, dan pengguna dapat masuk ke situs yang menurut mereka adalah milik Anda.
Mencegah serangan pengalihan terbuka
Saat mengembangkan aplikasi web, semua data yang disediakan pengguna diperlakukan sebagai tidak dapat dipercaya. Jika aplikasi Anda memiliki kemampuan untuk mengalihkan pengguna berdasarkan konten URL, pastikan pengalihan tersebut hanya dilakukan secara lokal di aplikasi Anda (atau pengalihan ke URL yang diketahui, bukan URL apa pun yang mungkin disediakan dalam querystring).
Pengalihan Lokal
Menggunakan metode pembantu Controller di kelas dasar LocalRedirect:
Jika URL non-lokal ditentukan, LocalRedirect akan melemparkan pengecualian. Jika tidak, itu berperilaku sama dengan metode Pengalihan. Informasi pengecualian adalah sebagai berikut:
InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local. Kode sumbernya adalah sebagai berikut:
Proses eksekusi: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, dan pada akhirnya, IsLocalUrl akan dipanggil untuk menilai (UrlHelperFactory mengimplementasikan antarmuka IUrlHelperFactory secara default. )。
Alamat kode sumber:Login hyperlink terlihat.
IsLocalUrl
IsLocalUrl sebelum mengalihkan, uji URL menggunakan metode ini:
Kodenya adalah sebagai berikut:
Kode pengujiannya adalah sebagai berikut:
Jika Anda diizinkan untuk melompat ke situs nama domain lain, Anda dapat mengimplementasikan antarmuka IUrlHelperFactory dan memodifikasi IServiceCollection untuk menggantikan kelas implementasi default saat program dimulai.
Referensi:Login hyperlink terlihat.
(Akhir)
|