开放 URL 重定向 (Open URL Redirect)
当 Web 应用程序接受可能导致应用程序将请求重定向到不可信输入所包含的 URL 的不可信输入时,就可能发生未经验证的重定向和转发。通过将不可信的 URL 输入修改为恶意站点,攻击者可能会成功发起网络钓鱼诈骗并窃取用户凭据。由于修改后链接中的服务器名称与原始站点相同,网络钓鱼尝试可能具有更值得信赖的外观。未经验证的重定向和转发攻击也可用于恶意构造一个能够通过应用程序访问控制检查的 URL,然后将攻击者转发到他们通常无法访问的特权功能。
摘要 (Summary)
方法论 (Methodology)
当 Web 应用程序或服务器使用未经证实的、用户提供的输入将用户重定向到其他站点时,就会发生开放重定向漏洞。这允许攻击者构建指向易受攻击站点的链接,该链接会重定向到他们选择的恶意站点。
攻击者可以利用此漏洞进行网络钓鱼活动、会话窃取,或强迫用户在未经其同意的情况下执行操作。
示例:Web 应用程序具有一项功能,允许用户单击链接并自动重定向到保存的首选主页。这可能是这样实现的:
攻击者可以在此处利用开放重定向,将 userpreferredsite.com 替换为指向恶意网站的链接。然后,他们可以在网络钓鱼电子邮件或另一个网站上分发此链接。当用户点击链接时,他们将被带到恶意网站。
HTTP 重定向状态码 (HTTP Redirection Status Code)
HTTP 重定向状态码(以 3 开头的状态码)表示客户端必须采取进一步行动才能完成请求。以下是一些最常见的状态码:
- 300 Multiple Choices (多种选择) - 表示请求有多个可能的响应。客户端应选择其中一个。
- 301 Moved Permanently (永久移动) - 意味着请求的资源已永久移动到 Location 头部给出的 URL。所有未来的请求都应使用新的 URI。
- 302 Found (已找到) - 此响应代码表示请求的资源已临时移动到 Location 头部给出的 URL。与 301 不同,它并不意味着资源已永久移动,只是暂时位于其他地方。
- 303 See Other (参见其他) - 服务器发送此响应以指示客户端通过 GET 请求在另一个 URI 处获取请求的资源。
- 304 Not Modified (未修改) - 用于缓存目的。它告诉客户端响应未被修改,因此客户端可以继续使用响应的同一个缓存版本。
- 305 Use Proxy (使用代理) - 必须通过 Location 头部中提供的代理访问请求的资源。
- 307 Temporary Redirect (临时重定向) - 意味着请求的资源已临时移动到 Location 头部给出的 URL,未来的请求仍应使用原始 URI。
- 308 Permanent Redirect (永久重定向) - 意味着资源已永久移动到 Location 头部给出的 URL,未来的请求应使用新的 URI。它类似于 301,但不允许更改 HTTP 方法。
重定向方法 (Redirect Methods)
基于路径的重定向 (Path-based Redirects)
重定向逻辑可能依赖于路径而不是查询参数:
- 在 URL 中使用斜杠:
https://example.com/redirect/http://malicious.com - 注入相对路径:
https://example.com/redirect/../http://malicious.com
基于 JavaScript 的重定向 (JavaScript-based Redirects)
如果应用程序使用 JavaScript 进行重定向,攻击者可以操纵脚本变量:
示例:
载荷 (Payload):?redirectTo=http://malicious.com
常见的查询参数 (Common Query Parameters)
?checkout_url={payload}
?continue={payload}
?dest={payload}
?destination={payload}
?go={payload}
?image_url={payload}
?next={payload}
?redir={payload}
?redirect_uri={payload}
?redirect_url={payload}
?redirect={payload}
?return_path={payload}
?return_to={payload}
?return={payload}
?returnTo={payload}
?rurl={payload}
?target={payload}
?url={payload}
?view={payload}
/{payload}
/redirect/{payload}
过滤器绕过 (Filter Bypass)
-
使用白名单域名或关键词
-
使用 CRLF 绕过 "javascript" 黑名单关键词
-
使用 "
//" 和 "////" 绕过 "http" 黑名单关键词 -
使用 "https:" 绕过 "
//" 黑名单关键词 -
使用 "
\/\/" 绕过 "//" 黑名单关键词 -
使用 "
%E3%80%82" 绕过 "." 黑名单字符 -
使用空字节 "
%00" 绕过黑名单过滤器 -
使用 HTTP 参数污染 (HTTP Parameter Pollution)
-
使用 "@" 字符。 常见互联网方案语法 (Common Internet Scheme Syntax)
-
创建以其域名命名的文件夹
-
使用 "
?" 字符,浏览器会将其翻译为 "/?" -
主机/拆分 Unicode 归一化 (Host/Split Unicode Normalization)