什么是開放重定向?

在了解什么是開放重定向之前,讓我們先了解一下重定向的確切含義。?

重定向是一種 HTTP 響應代碼,它會將用戶代理發送到與請求的 URL 不同的 URL。黑客使用重定向的原因有很多,包括更改網站結構、將用戶代理傳遞到其他網站或在多個 URL 下提供相同的內容。不過,如果重定向實施不當,可能會導致開放重定向。

開放重定向是一種漏洞,可用于操縱應用程序將用戶重定向到非預期 URL。這可以通過操縱 URL 以包含將用戶重定向到其他 URL 的參數來實現。這是大多數應用程序中最常見的漏洞之一。

開放重定向漏洞可能源于網站或服務上不安全的輸入驗證,允許參數篡改。通過執行重定向,攻擊者可以竊取用戶的憑證,將用戶重定向到釣魚網站,并進行更多惡意操作。

開放重定向的類型

開放重定向(open redirect)分為兩種類型:基于標頭和基于 JavaScript,也稱為 I 型開放重定向和 II 型開放重定向。 

1.基于標頭的開放重定向漏洞

這種開放重定向是通過 HTTP 響應標頭實現的,由于其多用途,很容易被濫用。 

例如,location 標頭會將用戶重定向到另一個位置或資源。但是,攻擊者也可以使用它來將用戶重定向到惡意 URL。然后,攻擊者可以使用 location 標頭通過操縱 URL 在身份驗證過程后重定向用戶,將用戶發送到釣魚網站。

2.基于JavaScript的開放重定向漏洞

行業使用 JavaScript 開發應用程序(前端和后端)。Web 應用程序在重定向到非預期目標之前未能驗證請求 URI 可能會導致這種類型的開放重定向。根據情況,此類問題可能發生在前端或后端。

由于開放重定向而產生的漏洞

許多人忽視了解決開放重定向漏洞的重要性。他們認為這只是一個允許某人將用戶重定向到其他網站的漏洞。但黑客可以利用此漏洞做更多的事情。

一旦黑客發現并利用此漏洞,就不再只是重定向的問題了。他可以執行網絡釣魚攻擊、跨站點腳本攻擊,甚至是服務器端請求偽造攻擊。讓我們嘗試逐一了解它們。

1.網絡釣魚攻擊

網絡釣魚攻擊是網絡犯罪分子竊取用戶憑證的最常見方式,最常見的攻擊媒介之一就是開放重定向漏洞。

2.跨站點腳本攻擊

黑客可以使用開放重定向將參數重定向到 JavaScript 來執行 XSS 負載。將開放重定向轉換為XSS 的兩個最常見負載是

3. 服務器端請求偽造

如果應用程序向重定向 URL 發送 HTTP 請求,開放重定向可能會導致服務器端請求偽造攻擊。

黑客如何利用開放重定向漏洞

開放重定向漏洞是攻擊者進行網絡釣魚攻擊的最常見方式。

黑客進行網絡釣魚攻擊來竊取您的個人信息,如信用卡詳細信息、用戶名、密碼等。 

當用戶訪問帶有易受攻擊參數的網站時,攻擊者會精心設計一個 URL,將用戶重定向到惡意網站。該 URL 可能類似于下面帶有易受攻擊的 redirectURL 參數的 URL。一旦用戶打開該 URL,他就會被重定向到 https://example.phishing.com 。

URL 重定向是如何發生的?

在上面提供的 URL 中,example.com 是受信任的域,redirectURL 是包含用戶在身份驗證后將被重定向到的 URL 的參數。兩個指針使此 URL 非常適合網絡釣魚攻擊:

  1. URL 的長度相當長,這降低了用戶閱讀最后部分的可能性。
  2. 用戶在閱讀 URL 第一部分的受信任域后,就會信任該 URL。

一旦用戶打開此 URL,應用程序就會將用戶重定向到 redirectURL 參數中的 URL。 

惡意網站會像原始網站一樣要求輸入用戶名和密碼等敏感信息。一旦用戶提供了憑證,攻擊者就可以訪問用戶的帳戶。

在許多情況下,用戶直到為時已晚才意識到自己已被重定向到惡意網站。

通過示例(代碼)理解開放重定向

假設您有一個網站,其中有一個用 ReactJS 制作的電子郵件驗證端點組件。

import React, { useState, useEffect } from 'react';
import { useLocation } from "react-router-dom"

export default function Email(){

const { search } = useLocation();
const queryParams = search.split('?').join().split('&');

const [loginData, setLoginData]=useState({
token:'',
validated:false,
});

const getRedirectURL =()=>{
if(queryParams.length>0){
const redirectTo=queryParams[1]?.split('=')[1];
console.log(redirectTo);
return redirectTo;
}
}

const validateUserEmail =()=>{
let response= "" // Send API request to validate user email
let redirectURL = “”
if (response.success){
setLoginData({...loginData, validated:true});
redirectURL = getRedirectURL();
} else {
redirectURL = “/login”;
}
if(redirectURL){
window.location.href=redirectURL;
}
}

useEffect(()=>{
validateUserEmail()
},[])
return(
<div className="login-form">
{
!loginData.validated? <h1>Email Not Verified</h1>: <h1>Redirecting to /dashboard</h1>
}
</div>
)}

在上面的例子中,我們在 /email 路由上有一個用于電子郵件驗證的功能組件。電子郵件驗證的 URL 將如下所示:

http://www.example.com/email?token=xyz&redirectTo=/dashboard

一旦用戶打開電子郵件驗證鏈接,該組件將從 URL 中驗證電子郵件驗證令牌,如果電子郵件通過驗證,則將用戶重定向到 redirectURL 參數;否則,將重定向到 /login 路由。

上述代碼容易受到開放重定向攻擊。如果攻擊者使用惡意的 redirectURL 參數制作 URL,他可以輕松重定向用戶。

http://localhost:3000/email?token=helloIamaToken&rediectTo=https://www.evil.com

為了防止上述代碼中的開放重定向,建議您使用 useHistory 鉤子,而不是使用 window.location.href。示例代碼如下所示:

import React, {useState, useEffect} from 'react';
import {useHistory, useLocation} from "react-router-dom"

export default function Email(){
const { search } = useLocation();
const history = useHistory();

const queryParams = search.split('?').join().split('&');

const [loginData, setLoginData]=useState({
token:'',
validated:false,
});

const getRedirectURL =()=>{
if(queryParams.length>0){
const redirectTo=queryParams[1]?.split('=')[1];
return redirectTo;
}
return;
}

const validateUserEmail =()=>{
let response= "" // Send API request to validate user email
setLoginData({...loginData, validated:true});
let redirectURL = getRedirectURL();
if(redirectURL){
// Redirect User to the URL using history.push
history.push(redirectURL);
}
}

在上面的代碼中,即使攻擊者試圖操縱參數,用戶也會被重定向到http://localhost:3000/https://www.evil.com。

此外,為了增加額外的安全性,開發人員可以創建一個輔助函數來檢查 URL 是否是相對 URL。

現在我們了解了開放重定向是如何發生的,讓我們集中討論一下為避免開放重定向應該牢記的幾件事。

使用開放重定向時應避免的 3 件事

開放重定向是網絡上相當常見的問題,因此務必牢記這些要點以避免此類風險。

  1. 避免在 URL 中使用重定向參數,將其存儲在本地存儲中,或者改用代碼使用自定義路徑。
  2. 如果使用重定向參數,請驗證提供的輸入(查詢字符串)。
  3. 使用白名單并在實施重定向時驗證 URL 是否是相對的。

避免安全漏洞的最佳實踐

安全性是構建 Web 應用程序或網站時要考慮的最重要的因素之一。它是通往客戶信息或數據的門戶。您必須采取一切可能的措施來避免安全風險。以下是防止 Web 應用程序中出現安全漏洞的最佳實踐列表。

1. 始終驗證用戶輸入

用戶輸入是造成安全漏洞的最大原因之一。當應用程序接受用戶輸入并盲目地根據輸入采取行動時,它將面臨一系列全新的漏洞。

2. 不要將敏感數據寫入日志

日志中的數據應為最低限度。這意味著您永遠不應記錄用戶名、密碼、信用卡信息等基本數據。您可以添加有助于調試和分析的數據。如果您看到可能危及安全的數據或信息,則不應將其包含在日志中。

3. 使用“始終拒絕”規則

最簡單的思考方式是,如果您沒有明確允許某些內容,則所有訪問控制都會被拒絕。如果您能在系統設計初期就發現潛在問題,則可以防止這些問題發生。默認情況下,拒絕對所有內容的訪問,然后確定需要允許哪些訪問,這很容易。 

4. 自動測試構建管道中的安全漏洞

在不斷變化的 Web 應用程序開發環境中,公司需要采取額外措施來確保其 Web 應用程序中沒有安全漏洞。開發人員的主要關注點是最終產品,而不是平臺上可能存在的安全漏洞。

文章來源:What is Open Redirect?

上一篇:

.NET 安全指南

下一篇:

什么是路徑遍歷
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費