滲透測試中的 URL 重定向
開放重定向(Open Redirect),也叫URL跳轉漏洞,是指服務端未對傳入的跳轉url變量進行檢查和控制,導致誘導用戶跳轉到惡意網站,由于是從可信的站點跳轉出去的,用戶會比較信任。
滲透測試中的 URL 重定向
常見的 URL 重定向漏洞都比較明顯,但是也有少數例外,這里總結了三種常見的 URL重定向類型。
類型一:基于參數的 URL 重定向
這是最常見的,通過修改參數中的跳轉地址,查看是否重定向到我們指定的頁面,比如:

類型二:恢復原訪問頁導致的重定向
通常為了提高用戶的體驗,在用戶登錄之后,往往會跳轉至原來的訪問頁面,比如:
https://example.com/login?returnUrl=/dashboard
登錄之后會跳轉至 /dashboard,并且是以登錄后的身份,這時我們可以測試是否會跳轉目標以外的網站,比如:
https://example.com/login?returnUrl=https://www.xazlsec.com
如果登錄成功之后,跳轉至信安之路的網站,那么該漏洞就存在。
類型三:基于 html 標簽的 URL 跳轉
實現 URL 重定向,除了在 header 中設置 Location 字段外,還有兩種實現方式:
1、Meta 標簽,代碼如下:
<head> <meta http-equiv="Refresh" content="0; URL=https://example.com/" />head>
2、javaScript 代碼:
window.location = "https://example.com/";
如果是這兩種方式實現 URL 跳轉,而 URL 參數可控,則可能存在 XSS 漏洞。
類型四:基于 DOM 的 URL 重定向
JavaScript 可以直接從瀏覽器獲取數據。Web 瀏覽器中的 URL,例如:
https://example.com/#dashboard
dashboard 不會被發送至后端,如果頁面中使用如下 JavaScript 代碼:
// use substr() to remove the '#'window.location = window.location.hash.substr(1)
攻擊者可以創建如下鏈接:
https://example.com/#https://www.xazlsec.com
訪問之后將跳轉至信安之路的網站。
URL 重定向漏洞修復
方案一:URL 白名單
可以將需要跳轉的頁面,保存至數據庫,然后用對應的 id 進行跳轉,比如:
https://example.com/redirect?externalPage=1https://example.com/redirect?externalPage=2https://example.com/redirect?externalPage=3
如果只是重定向到本網站的頁面,可以使用頁面命名方案,比如:
https://example.com/redirect?page=dashboardhttps://example.com/redirect?page=accounthttps://example.com/redirect?page=settings
方案二:正則表達式
正則表達式的方案,無需操作數據庫,但是設置不好容易被繞過,比如下面的案例:
redirect_url = urlparse.urlparse(url)# 漏洞參數原因,僅匹配 url前綴if bool(re.search("^https://example.com", url)):
只是搜索 url 中是否包含 https://example.com 且以它為開頭,可以用下面的 poc 繞過:
https://example.com/redirect?page=https://example.com.evil-hackers.corp.com
要使用正則表達式,使用尾部斜杠以防止惡意使用子域:
redirect_url = urlparse.urlparse(url) #修復后,限定完整域名if bool(re.search("^https://example.com/", url)):
這樣就確保不會重定向到設置之外的域。
方案三:任意 URL 跳轉功能
有些功能設計之初就是為了能夠跳轉至任意網站,比如一些推廣功能,這種情況下,最基本的也要對跳轉的協議做限制,比如只允許跳轉以 https?:// 開頭的網站。
在跳轉至外部網站時,設置提示,提醒用戶,比如:

總結
URL 重定向本身并不是壞事,但您必須采取措施確保用戶都知道發生的外部重定向,并在必要時盡量減少重定向到的目標。