如果攻擊者操控了 redirect_uri,會怎樣?

尹三黎發表於2021-06-11

  讀者在看這篇文章之前,請先了解 Oauth2.0 的 Authorization Code 授權流程,可以看 Authorization Code 授權原理和實現方法

 

  在 Token Enpoint 中,按照 Oauth2.0 的標準,需要傳遞一個 redirect_uri 引數。然而,程式碼卻只對這個引數做檢查,沒有其他處理邏輯,這背後的原因是什麼呢?這裡,涉及到一種針對 redirect_uri 的攻擊方法。

 

  我們還是用 A 來代表合作方,用 B 來代表鑑權方。我們知道,在合作開始之前,A 需要向 B 註冊 redirect_uri 。假如 A 註冊的是 a.com/*,也就是說,a.com 域名下的所有 path 都可以作為合法的 redirect_uri。而實際使用的時候,A 傳遞的是 a.com/recieve_code 這個 path。

  但是,攻擊者通過某種方式,控制了 a.com 域名下的一個 path,比如 a.com/attacker,此時會發生什麼呢?

 

  攻擊者可以做以下事情:

  1,攻擊者訪問 a.com,登入,然後通過點選,觸發授權流程

  2,此時 A 會開啟授權頁面,攻擊者通過瀏覽器的位址列,獲取到了整個 url

  3,攻擊者將 url 中的 redirect_uri 替換成 a.com/attacker,構建出一個新的 url

  4,攻擊者通過某種方式,誘騙真正的使用者點選新的 url

  5,使用者開啟授權頁面,看到的都是正常的資訊(B 即將授權給 A,以便 A 訪問你在 B 的資源),因此點選授權

  6,code 被髮送到 a.com/attacker,攻擊者拿到 code

  7,攻擊者手動通過瀏覽器訪問 a.com/recieve_code?code=xxxx ,此時 A 會去兌換 access token,然後將這個 access token 跟攻擊者的賬號繫結在一起(A 可能把 access token 存在 session 裡,也可能放在 db 裡,不管怎麼樣,肯定是和當前登入的賬號關聯起來的)

  8,到這裡,攻擊者就可以訪問真正的使用者在 B 的資源

 

  下面用圖來解釋。

 

  首先,在授權之前,使用者在 a.com 和 b.com 都是有賬號的:

 

  正常的授權流程完成後,應該是這個樣子:

 

  但是,經過攻擊者這一波操作後,變成了這個樣子:

 

  那麼,怎麼防禦這種攻擊呢?

  方法就是,B 在生成 code 的時候,記錄下來,這個 code 是傳送給 a.com/attacker 的:

    code -> a.com/attacker

  然後,當 A 用 code 來兌換 access token 的時候,告訴 B,我這個 code,是從 a.com/recieve_code 收到的:

    code <- a.com/recieve_code

  B 一比較,就發現這個 code 被人為搬動過,於是拒絕兌換,就可以了。

  

  以上,就是 redirect_uri 這個引數背後的考量。有問題可以直接評論。

相關文章