網站安全🔒 開放式重定向 Open Redirect 攻擊手法 — 「導遊放你自由行」

Jayden Lin
Jan 1 · 9 min read

筆者任職於 Yahoo ,線上課程:《經典駭客攻擊教程:給每個人的網站安全入門》|粉絲團:《程式猿吃香蕉🍌》

大家旅行的時候喜歡跟團還是自由行呢?或是否有被導遊放生變成自由行的體驗?本篇文章將使用「旅遊」的概念來說明「開放式重定向 Open Redirect 」攻擊手法,便於大家了解這項攻擊手法的嚴重性。

這類攻擊最常發生在網站登入流程,因為網站登入後的跳轉如果沒有指定白名單或做驗證,很容易被駭客利用來做「釣魚攻擊」,那麼防禦的重點就在於怎麼正確的「驗證」跳轉的網址了。

本篇文章將先說明「開放式重定向 Open Redirect 」的攻擊原理與損害,並先說明「錯誤」的防禦方式,供大家自己的防禦方式是否正確,最後再分享正確的防禦重點事項。

本篇內容:
✔ 開放式重定向 Open Redirect 的攻擊原理與損害
✔ 防禦注意事項:正確與錯誤的防禦方式
✔ 小結

▍開放式重定向 Open Redirect 攻擊原理與損害

談攻擊原理之前,我們先來談「重定向」( Redirect ) 這件事情,相信許多人都有登入帳號後,頁面跳轉到網站首頁或回到前頁面的經驗,這就是「重定向」( Redirect )。

許多網站的程式寫法,都是在登入網址的後面加上一個網址參數 ( Query Parameter ) 來指定登入後的跳轉位置,例如:

https://example.com/signin?redirect_uri=/home

網址參數 ( Query Parameter ) 的名稱根據網站的不同而有所差異,常見的參數還有 return_uri 、 return_url 、redirect_url 、done 、 success_uri、 success_url、 forward_url、 forward_uri、 forward 等等

下次再登入網站的時候,大家可以注意看看網址的後面是否藏有這個參數,以 Yahoo 登入為例,它的網址最後就多了 done 這個參數來指定登入後「重定向」( Redirect ) 的目的地 (如下圖所示) 。

有些人可能會警覺到,既然網址參數是在客戶端 (Client side),那麼就提供了駭客一個注入 (injection) 惡意內容的機會。

想像一下,經營網站就像經營旅行社一樣,旅行社提供使用者良好的旅遊體驗,每一個景點與移動都要仔細設計。這就如同網站經營者精心安排網站內容,每個導航 (Navigation ) 按鈕與頁面流程的跳轉,都需要良好地設計,讓使用者有良好的網站使用體驗。

然而,若是你的網站有「開放式重定向 Open Redirect 」的漏洞, redirect_uri 重定向的網址便可以被駭客指定到一些惡意的網頁,就會破壞整體的瀏覽體驗。

https://example.com/signin?redirect_uri=https://example.coom/payment

舉例來說,如上網址所示,網址將在登入後導到 https://example.coom/payment 網站,而 example.coom 不同於 example.com ,網址多了一個 o ,是駭客所經營的惡意釣魚網站,偽裝成 eaxmple.com騙 取使用者輸入信用卡資訊。

駭客將此連結 ( 如下圖所示 ),隨機送給使用者,使用者一時不查,只看到前半段網址是 example.com 就點擊進入登入頁面,沒注意到登入後會被跳轉到 example.coom/payment 這個惡意釣魚網址,以至於使用者跳轉後仍「以為」自己在 example.com ,基於對 example.com 網站的信任而填入信用卡資訊,造成攻擊發生。

以旅行社的譬喻方式來說,就像你經營了一間旅行社,大部分的導遊都很認真,安排很棒的旅遊行程 ,但有一個「不守規定的導遊」,允許遊客任意指定旅行地點 ( 如同網站出現「開放式重定向 Open Redirect 」漏洞 ),把原本安排得好好的旅遊行程讓遊客「自訂」搞成自由行。

最糟糕的是,被自訂的行程還會影響到其他旅客。

舉例來說,有一個惡意的遊客把導遊的目的地改成到劣質紀念品店採買(從中賺取分潤),那麼其他的遊客遇到這名「不守規定的導遊」的時候,其行程也會被改成劣質紀念品店採買。注意這裡的幾個角色,有幫助於大家理解「開放式重定向 Open Redirect 」攻擊:

  • 惡意遊客:其角色就像駭客一樣,指定 redirect_uri 重定向的網址,將其他使用者導向惡意的釣魚網站騙取使用者信用卡資訊。惡意的遊客則是利用「不守規定的導遊」,將其他旅客導向劣質紀念品採買的行程,而其他遊客基於對於旅行社的信任感,所以對於導遊的行程不疑有他,而造成惡意遊客 (駭客) 的行為成功。就像駭客利用其他使用者對於你的網站的信任,對於從你網站導往的目的地位置有信任感,而造成攻擊成功。
  • 不守規定的導遊:其角色就如同開放式重定向 Open Redirect 」的程式漏洞,被駭客利用來進行攻擊。
  • 旅行社:其角色就像你的網站一樣,辛苦經營且有良好的品牌聲譽,所有流程都安排得很棒,有良好得使用者體驗 (就如同其他導遊都安分守己的帶團),但因為有「開放式重定向 Open Redirect 」漏洞 (就如同那位不守規矩的導遊) 而被駭客利用去做壞事。

基於以上的概念,那麼防禦重點就在於怎麼處理那名「不守規定的導遊」,至少讓他思想正確一點,對於「惡意遊客 」要求的旅行「目的地」,能有正確的「判斷能力」,以程式碼的觀點來看,就是要正確的驗證重定向網址的「目的地」。

▍防禦注意事項:正確與錯誤的防禦方式

已知防禦的重點是要驗證重定向網址的「目的地」,只是…該怎麼驗證?

  • 若跳轉的目的地是使用「部分網址」(例如:使用 /payment,而不是完整的網址),不能只驗證重定向網址字串開頭是否為 / ,因為駭客會使用 //example.coom 來通過驗證,並且 //example.coom 成了「完整網址」,跳出了「部分網址」限制跳轉的頁面在同站的限制,較好的方式是採用白名單,指定可以被跳轉的路徑。
  • 若是跳轉的目的地是相對路徑 (Relative Path),例如:使用 ../payment,要同時注意是否有目錄遍歷 Path Traversal 漏洞。有關目錄遍歷 Path Traversal 的攻擊與防禦手法可以參考我先前撰寫的這篇文章:
  • 若跳轉的目的地是「完整網址」,驗證合法網域 ( Domain ) 的時候,不能只判斷字串開頭,例如:不能只判斷重定向網址字串開頭是否為 https://example.com ,因為這會造成 https://example.com.hacker.com 這種惡意網域能通過驗證,較好的方式是驗證網域的結尾或是指定整個網域 ( Domain ),而不是只要驗證開頭。
  • 駭客輸入的重定向網址字串當中,有些並不是「網址」,例如:data:text/html,<script>alert(1)</script> 或是 javascript:alert(1) 等等,會直接造成瀏覽器的 JavaScript 程式執行。

▍小結

開放式重定向 Open Redirect 攻擊之所以經常被大家忽略,是因為它並不是直接「破壞」現有的網站,駭客還需要配合搭建對應的釣魚網站來讓攻擊效益最大化。但這並不表示這類的漏洞不重要,因為不論是後續釣魚網站造成的帳號密碼的外洩、或是信用卡資料被盜取,這些都是對網站的信譽有很大的傷害。因此在頁面的跳轉上,重定向網址的使用一定要有妥善的規劃與驗證,具備有資訊安全的思維才能讓網站的運營長長久久。

以上的內容是我對「開放式重定向 Open Redirect 」的分享,希望對大家有幫助。若是喜歡我分享的網站安全內容,也可以參考我其他文章或是我的線上課程《經典駭客攻擊教程:給每個人的網站安全入門》:

若是喜歡我分享的內容,歡迎幫我按個拍手,可拍 50下,給我一點鼓勵,或是加入我的粉絲團《程式猿吃香蕉🍌》,一起分享軟體知識與心得!

程式猿吃香蕉

喜歡將軟體知識以簡單生動的方式講給你聽

程式猿吃香蕉

『來點更營養的軟體知識,吃香蕉吧!』我們是一群軟體開發愛好者,喜歡將軟體知識以簡單生動的方式講給你聽,順口好消化,營養又健康!

Jayden Lin

Written by

Yahoo 擔任 Lead Engineer,負責廣告系統,帶團隊做跨國開發。也是《程式猿吃香蕉》團隊創辦人,喜歡將實用的軟體知識以簡單生動的方式講給大家聽 😄😄😄

程式猿吃香蕉

『來點更營養的軟體知識,吃香蕉吧!』我們是一群軟體開發愛好者,喜歡將軟體知識以簡單生動的方式講給你聽,順口好消化,營養又健康!