前言
簡單介紹一下重定向攻擊。
正文
攻擊思路:
看著上面挺複雜的,其實是一些很簡單的步驟。
- 攻擊者通過某些手段,讓使用者開啟了一個好站點,開啟的這個地址裡面帶有重定向資訊,重定向資訊就是自己偽造的站點。
這是因為我們一般不知道網站從哪個頁面而來,登入後會返回偽造的站點,也就是我們的後臺會利用重定向資訊。
-
然後使用者就輸入了正確的賬戶密碼,然後重定向到偽造的站點,這個偽造的站點也是一個登入頁面,和真實站點一模一樣。
-
這個時候使用者以為自己賬戶密碼輸入錯誤,然後再輸入一遍,這個時候攻擊者就拿到了使用者的賬戶密碼,然後再跳轉到官方站點。
-
因為跳轉到官方站點了,然後使用者是可以正常操作的,使用者就以為一切操作正常,然後就很開心的買買買了。
上述攻擊步驟大體是這樣。
攻擊的必要條件:
-
我們的站點沒有驗證重定向的地址
-
使用者訪問了偽造站點
第二點基本上沒有解決方案,因為我們不知道會遇上什麼樣的使用者。
重定向方案:
-
使用localRedirest 來處理重定向
-
驗證重定向的目標域名是否合法
那麼下面就看下這兩種防範方式。
[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);
結
下一節防跨站指令碼攻擊。