Mencegah serangan pengalihan terbuka di ASP.NET Core
Aplikasi web yang mengalihkan ke URL yang ditentukan melalui permintaan seperti querystring atau data formulir berpotensi diubah untuk mengalihkan pengguna ke URL eksternal yang berbahaya. Pengubahan ini disebut serangan pengalihan terbuka.
Setiap kali logika aplikasi Anda dialihkan ke URL tertentu, Anda harus memverifikasi bahwa URL pengalihan belum dirusak. ASP.NET Core memiliki fungsionalitas bawaan untuk membantu melindungi aplikasi dari serangan pengalihan terbuka (juga dikenal sebagai pengalihan terbuka).
Apa itu serangan pengalihan terbuka?
Aplikasi web sering mengalihkan pengguna ke halaman masuk saat mereka mengakses sumber daya yang memerlukan autentikasi. Pengalihan biasanya menyertakan returnUrl
parameter querystring sehingga pengguna dapat dikembalikan ke URL yang awalnya diminta setelah mereka berhasil masuk. Setelah pengguna mengautentikasi, mereka dialihkan ke URL yang awalnya diminta.
Karena URL tujuan ditentukan dalam querystring permintaan, pengguna berbahaya dapat mengubah querystring. Querystring yang dirusak dapat memungkinkan situs mengalihkan pengguna ke situs eksternal yang berbahaya. Teknik ini disebut serangan pengalihan terbuka (atau pengalihan).
Contoh serangan
Pengguna berbahaya dapat mengembangkan serangan yang dimaksudkan untuk memungkinkan pengguna jahat mengakses kredensial atau informasi sensitif pengguna. Untuk memulai serangan, pengguna berbahaya meyakinkan pengguna untuk mengklik tautan ke halaman masuk situs Anda dengan nilai querystring yang returnUrl
ditambahkan ke URL. Misalnya, pertimbangkan aplikasi di contoso.com
yang menyertakan halaman masuk di http://contoso.com/Account/LogOn?returnUrl=/Home/About
. Serangan mengikuti langkah-langkah berikut:
- Pengguna mengklik tautan berbahaya ke
http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn
(URL kedua adalah "contoso1.com", bukan "contoso.com"). - Pengguna berhasil masuk.
- Pengguna dialihkan (oleh situs) ke
http://contoso1.com/Account/LogOn
(situs berbahaya yang terlihat persis seperti situs nyata). - Pengguna masuk lagi (memberikan kredensial mereka kepada situs berbahaya) dan dialihkan kembali ke situs nyata.
Pengguna kemungkinan percaya bahwa upaya pertama mereka untuk masuk gagal dan bahwa upaya kedua mereka berhasil. Pengguna kemungkinan besar tetap tidak menyadari bahwa kredensial mereka disusupi.
Selain halaman masuk, beberapa situs menyediakan halaman pengalihan atau titik akhir. Bayangkan aplikasi Anda memiliki halaman dengan pengalihan terbuka, /Home/Redirect
. Penyerang dapat membuat, misalnya, tautan dalam email yang masuk ke [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login
. Pengguna umum akan melihat URL dan melihatnya dimulai dengan nama situs Anda. Mempercayai itu, mereka akan mengklik tautan. Pengalihan terbuka kemudian akan mengirim pengguna ke situs pengelabuan, yang terlihat identik dengan milik Anda, dan pengguna kemungkinan akan masuk ke apa yang mereka yakini adalah situs Anda.
Melindungi dari serangan pengalihan terbuka
Saat mengembangkan aplikasi web, perlakukan semua data yang disediakan pengguna sebagai tidak dapat dipercaya. Jika aplikasi Anda memiliki fungsionalitas yang mengalihkan pengguna berdasarkan konten URL, pastikan bahwa pengalihan tersebut hanya dilakukan secara lokal dalam aplikasi Anda (atau ke URL yang diketahui, bukan URL apa pun yang mungkin disediakan di querystring).
LocalRedirect
Gunakan metode pembantu LocalRedirect
dari kelas dasar Controller
:
public IActionResult SomeAction(string redirectUrl)
{
return LocalRedirect(redirectUrl);
}
LocalRedirect
akan memberikan pengecualian jika URL non-lokal ditentukan. Jika tidak, itu berakibat seperti metode .Redirect
IsLocalUrl
IsLocalUrl Gunakan metode untuk menguji URL sebelum mengalihkan:
Contoh berikut menunjukkan cara memeriksa apakah URL bersifat lokal sebelum mengalihkan.
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}
Metode ini IsLocalUrl
melindungi pengguna agar tidak diarahkan secara tidak sengaja ke situs berbahaya. Anda dapat mencatat detail URL yang disediakan saat URL non-lokal disediakan dalam situasi di mana Anda mengharapkan URL lokal. URL pengalihan pengelogan dapat membantu dalam mendiagnosis serangan pengalihan.
ASP.NET Core
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk