簡介 那些通過請求(如查詢字元串和表單數據)指定重定向URL的Web程式可能會被篡改,而把用戶重定向到外部的惡意URL。這種篡改就被稱為開發重定向攻擊。 場景分析 假設有一個正規網站http://nerddinner.com/,還有一個惡意網站或釣魚網站http://nerddiner.com/(註 ...
簡介
那些通過請求(如查詢字元串和表單數據)指定重定向URL的Web程式可能會被篡改,而把用戶重定向到外部的惡意URL。這種篡改就被稱為開發重定向攻擊。
場景分析
假設有一個正規網站http://nerddinner.com/,還有一個惡意網站或釣魚網站http://nerddiner.com/(註意:這裡少了個n)。
一天,小白收到了別人發的鏈接:http://nerddinner.com/Account/LogOn?returnUrl=http://nerddiner.com。
1. 打開鏈接後進入了登錄界面,小白輸入了自己的帳號名密碼進行登錄。
2. 登錄成功後重定向到了惡意網站。
3. 惡意網站是一個仿造正規網站的登錄頁面,併在上面提示用戶名或密碼錯誤。
4. 小白按照提示重新輸入了帳號密碼信息。
5. 惡意網站保存了客戶的用戶名密碼,然後重定向會正規網站。
6. 小白繼續平時正常的操作。
防止開放重定向
防止開發重定向只需要判斷重定向的鏈接是本地的鏈接或者是合法的鏈接即可。
1. 如果登錄鏈接和站點其他頁面都在同一個功能變數名稱,在ASP.MVC中可以用Url.IsLocalUrl(string url)來判斷。
2. 如果登錄鏈接和站點其他頁面不在同一個功能變數名稱,如單點登錄,則需要自己去實現判斷的邏輯。
核心代碼
1 [HttpPost] 2 public ActionResult LogOn(LogOnModel model, string returnUrl) 3 { 4 //Your logon logic here. 5 FormsAuthentication.SetAuthCookie(model.UserName, false); 6 //Comment out this code will cause open redirection 7 if (!string.IsNullOrEmpty(returnUrl)&& Url.IsLocalUrl(returnUrl)) 8 { 9 return Redirect(returnUrl); 10 } 11 return RedirectToAction("Index", "Home"); 12 }
聯想到XSS
1. 惡意用戶在正規網站下掛了跳轉到惡意網站的腳本。
2. 普通用戶訪問到含惡意腳本的頁面會跳轉到惡意網站。
3. 惡意網站是一個仿造正規網站的登錄頁面,併在上面提示需要重新登錄。
4. 小白按照提示重新輸入了帳號密碼信息。
5. 惡意網站保存了客戶的用戶名密碼,然後重定向會正規網站。
註:這種方式每次訪問含惡意腳本的頁面都會跳轉到惡意網站(提示重新登錄),而開放重定向只會提示用戶名密碼錯誤一次,相對而言,開放重定向的無感知效果要好一點。
源碼下載
如果大家想嘗試開放重定向的效果,可以去下載代碼,把判斷本鏈接的語句Url.IsLocalUrl(returnUrl)註釋掉,然後在登錄頁面加上想要跳轉到的頁面,如http://xxx.com/Account/LogOn?ReturnUrl=http://www.baidu.com。
下載地址:https://github.com/ErikXu/OpenRedirection
文章轉載自:http://www.cnblogs.com/Erik_Xu/p/5497479.html