什么是开放重定向?
Andrew2020-10-12 10:56:50
开放重定向是一种Web应用程序安全性问题,攻击者可以利用它来利用您的企业信誉来提高网络钓鱼攻击的效率。如果允许开放重定向,则攻击者可以发送网络钓鱼电子邮件,该电子邮件包含与您的域名的链接,受害者将被从您的Web服务器重定向到攻击者的站点。
请注意,2013年OWASP Top 10列表(A10未验证的重定向和转发中将开放重定向作为漏洞包括在内。
什么是重定向
当网站或Web应用程序更改客户端中访问的URL时,将发生重定向(通常是外部–内部重定向通常称为forwards)。从后端有几种方法可以做到这一点。通常,重定向是通过将特定的HTTP标头发送到客户端来进行的,但是您也可以使用JavaScript代码创建重定向。
什么是开放重定向
当客户端提供重定向的目标并且未对其进行过滤或验证时,将存在一个开放的重定向漏洞。以下是安全重定向和不安全重定向的一些示例:
- 如果合法网站将客户端重定向到固定URL,则这是安全的重定向。
- 如果合法网站根据用户提供的参数安全地构建重定向URL,则它是安全的重定向。
- 如果合法网站基于用户提供的参数构造了重定向URL,但没有充分验证/过滤输入,则它是不安全的重定向(攻击者可能会操纵输入)。
- 如果合法网站允许用户指定目标重定向URL,则它是不安全的重定向(开放重定向)。
通常,使用动态重定向(基于客户端的数据)的开发人员必须将此类数据视为不受信任的输入。否则,攻击者会将浏览器重定向到恶意站点,并使用您的域名来欺骗受害者。
例如,如果您的域是example.com,则攻击者可能创建以下URL:
https://example.com/redirect.php?url=http://attacker.com
然后,攻击者可以发送此URL作为网络钓鱼尝试的一部分,以将受害者重定向到恶意网站Attacker.com。攻击者希望开始时example.com的外观可信任,并使它们陷入网络钓鱼诈骗。
开放重定向的示例
以下简单的PHP代码创建一个开放的重定向:
$redirect = $_GET['url']; header("Location: " . $redirect);
这是一个开放的重定向漏洞,因为攻击者可能在GET请求的url参数值中提供恶意网站URL,然后此目标URL将作为Location标头发送,将客户端重定向到恶意网页。
开放式重定向漏洞的后果
如果您有一个开放的重定向漏洞,则它可能导致许多其他攻击:
- 网络钓鱼:使用开放重定向的最明显方法是将受害者从原始站点转移到看起来相同的站点,窃取用户凭据,然后返回漏洞站点,就像什么也没发生一样。
- 跨站点脚本(XSS):如果重定向允许使用data:或javascript:协议,并且客户端在重定向中支持此类协议,则攻击者可以执行XSS攻击。
- 服务器端请求伪造(SSRF):开放重定向可用于逃避SSRF筛选器。
- 内容安全策略绕过:如果使用CSP防御XSS,并且列入白名单的域之一具有开放重定向,则可以使用此漏洞绕过CSP。
- CRLF注入:如果重定向参数允许换行,攻击者可能会尝试执行响应头拆分。
如何防止打开重定向
防止开放重定向漏洞的最安全方法是在Web应用程序中不使用任何重定向。如果这不可能,则可以尝试以下方法:
- 使用固定目标页面列表。将其完整的URL存储在数据库表中,并使用标识符作为请求参数而不是URL本身来调用它们。例如,存储example2.com在数据库表与标识符42,然后使用下面的呼叫重定向到example2.com:example.com /重定向。php **?redir_id = 42。
- 如果您不能使用固定的重定向目标列表,请过滤不受信任的输入(如果可以,请使用白名单,而不是黑名单)。确保检查部分字符串,例如,http:// *example.com *.evil.com是有效的URL。此外,禁止使用除HTTP和HTTPS之外的所有协议。另请注意,尽管您尽了最大努力,攻击者还是有可能找到绕过您的过滤器的方法。

Andrew
暂无描述