防止 ASP.NET Core 中的開放式重新導向攻擊

重新導向至透過請求 (例如 Querystring 或表單資料) 指定之 URL 的 Web 應用程式可能會遭到篡改,從而將使用者重新導向至外部惡意 URL。 這種竄改稱為開放式重新導向攻擊。

每當應用程式邏輯重新導向至指定的 URL 時,您都必須確認重新導向 URL 並未遭到竄改。 ASP.NET Core 具有內建功能,可協助保護應用程式免受開放式重新導向 (又稱為開放式重導) 攻擊。

什麼是開放式重新導向攻擊?

當使用者存取需要驗證的資源時,Web 應用程式經常將使用者重新導向到登入頁面。 重新導向指令通常包含 returnUrl querystring 參數,讓使用者可在成功登入之後返回最初要求的 URL。 待使用者進行驗證之後,系統即會將他們重新導向至最初要求的 URL。

由於目的地 URL 是在該要求的 querystring 中指定,因此惡意使用者便可能會竄改此 querystring。 而遭竄改的 querystring 便可能讓網站將使用者重新導向至外部惡意網站。 這種技術稱為開放式重新導向 (或重新導向) 攻擊。

範例攻擊

惡意使用者可以發展相關攻擊,讓惡意使用者得以存取使用者的認證或機密資訊。 為了展開攻擊,惡意使用者會先說服使用者按一下指向您網站登入頁面的鏈接,並將 returnUrl querystring 值新增至 URL。 例如,假設有一應用程式位於 contoso.com,其中包含位於 http://contoso.com/Account/LogOn?returnUrl=/Home/About 的登入頁面。 攻擊會遵循下列步驟進行:

  1. 使用者按一下 http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn 的惡意連結 (第二個 URL 是「contoso1.com」,而不是「contoso.com」)。
  2. 使用者成功登入。
  3. 使用者被 (該網站) 重新導向至 http://contoso1.com/Account/LogOn (外觀與真實網站不分軒輊的惡意網站)。
  4. 使用者再次登入 (將其認證提供給了惡意網站),並重新導向回到真實網站。

使用者可能認為第一次登入嘗試失敗,而第二次嘗試成功。 使用者很可能渾然不知其認證已洩漏。

Open Redirection Attack Process

除了登入頁面之外,有些網站還提供重新導向頁面或端點。 假設您的應用程式有一個頁面,其中包含開放式重新導向 /Home/Redirect。 例如,攻擊者可以在電子郵件中建立指向 [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login 的連結。 一般使用者會查看 URL,並見到其開頭為您的網站名稱。 有了眼見為憑,他們便會按下該連結。 開放式重新導向隨即將使用者傳送至網路釣魚網站,其外觀與不僅您的網站一般無二,而且可能會讓使用者自認登人的確實是您的網站。

防範開放式重新導向攻擊

開發 Web 應用程式時,請將所有使用者提供的資料視為不可信。 如果您的應用程式具有會根據 URL 內容重新導向使用者的功能,請確保此類重新導向僅在您的應用程式本機進行(或重新導向至已知 URL,而不是 querystring 中可能提供的任何URL)。

LocalRedirect

使用基底 Controller 類別中的 LocalRedirect 協助程式方法:

public IActionResult SomeAction(string redirectUrl)
{
    return LocalRedirect(redirectUrl);
}

如果指定了非本機 URL,LocalRedirect 會擲回例外狀況。 否則,其行為就類似於 Redirect 方法。

IsLocalUrl

在重新導向之前,請使用 IsLocalUrl 方法來測試 URL:

下列範例示範如何在重新導向之前檢查 URL 是否為本機。

private IActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
}

IsLocalUrl 方法可保護使用者在無意間被重新導向至惡意網站。 您可以記錄詳細資料,列載原本預期為本機 URL 的情況下,所提供的非本機 URL 內容。 記錄重新導向 URL 可能有助於診斷重新導向攻擊。