所有文章 > 技术杂货铺 > 什么是开放重定向
什么是开放重定向

什么是开放重定向

如今,开放重定向攻击已成为 Web 应用程序中日益严重的问题,因为开放重定向可能导致许多严重漏洞。随着应用程序越来越多地使用外部数据源,对 URL 重定向的安全保护需求也日益增加。

在这篇文章中,我们将讨论开放重定向到底是什么,这种攻击是如何运作的,如何检测它,以及如何预防它。

什么是开放重定向? 图片

什么是开放重定向?

在了解什么是开放重定向之前,让我们先了解一下重定向的确切含义。 

重定向是一种 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 的两个最常见负载是

  • javascript:alert(1) 和
  • javascript://%250Aalert(1).

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?

#你可能也喜欢这些API文章!