Bagikan melalui


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:

  1. Pengguna mengklik tautan berbahaya ke http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (URL kedua adalah "contoso1.com", bukan "contoso.com").
  2. Pengguna berhasil masuk.
  3. Pengguna dialihkan (oleh situs) ke http://contoso1.com/Account/LogOn (situs berbahaya yang terlihat persis seperti situs nyata).
  4. 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.

Open Redirection Attack Process

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.