重新整理 .net core 實踐篇————重定向攻擊[三十九]

敖毛毛發表於2021-07-10

前言

簡單介紹一下重定向攻擊。

正文

攻擊思路:

看著上面挺複雜的,其實是一些很簡單的步驟。

  1. 攻擊者通過某些手段,讓使用者開啟了一個好站點,開啟的這個地址裡面帶有重定向資訊,重定向資訊就是自己偽造的站點。

這是因為我們一般不知道網站從哪個頁面而來,登入後會返回偽造的站點,也就是我們的後臺會利用重定向資訊。

  1. 然後使用者就輸入了正確的賬戶密碼,然後重定向到偽造的站點,這個偽造的站點也是一個登入頁面,和真實站點一模一樣。

  2. 這個時候使用者以為自己賬戶密碼輸入錯誤,然後再輸入一遍,這個時候攻擊者就拿到了使用者的賬戶密碼,然後再跳轉到官方站點。

  3. 因為跳轉到官方站點了,然後使用者是可以正常操作的,使用者就以為一切操作正常,然後就很開心的買買買了。

上述攻擊步驟大體是這樣。

攻擊的必要條件:

  1. 我們的站點沒有驗證重定向的地址

  2. 使用者訪問了偽造站點

第二點基本上沒有解決方案,因為我們不知道會遇上什麼樣的使用者。

重定向方案:

  1. 使用localRedirest 來處理重定向

  2. 驗證重定向的目標域名是否合法

那麼下面就看下這兩種防範方式。

[HttpGet]
public async Task<IActionResult> CookieLogin(string userName,string returnUrl)
{
	var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
	identity.AddClaim(new Claim("Name", userName));
	await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));
	return Redirect(returnUrl);
}

看到了吧,上面就直接通過Redirect(returnUrl);來跳轉。

那麼可以通過這樣:return LocalRedirect(returnUrl);

這樣就是隻能跳轉到同域名的網址下面。

LocalRedirect 會有驗證,然後丟擲異常,然後就被我們的未處理異常處理了,然後就進入404這樣子。

那麼這裡希望處理一下。

public async Task<IActionResult> CookieLogin(string userName,string returnUrl)
{
	var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
	identity.AddClaim(new Claim("Name", userName));
	await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));
	// return Redirect(returnUrl);
	try
	{
		return LocalRedirect(returnUrl);
	}
	catch
	{
		return Redirect(returnUrl);
	}
}

如果發現異常,跳轉到首頁,避免使用者認為我們的網站崩潰現象。

那麼如果我們有子站點就是和當前登入頁面不是同一域名的情況呢?那麼這個時候就需要我們自己驗證,尤其是現在的授權認證獨立出來服務後。

Uri uri = new Uri(returnUrl);
// 驗證一下
// 自我驗證,根據資料庫列表驗證,根據配置驗證等
return Redirect(returnUrl);

下一節防跨站指令碼攻擊。

相關文章