URL 重定向漏洞介绍

1. 概念

开放重定向(Open Redirect),也叫 URL 跳转漏洞,是指服务端未对传入的 URL 变量进行检查和控制,导致诱导用户跳转到恶意网站,由于是从可信的站点跳转出去的,用户会比较信任。

URL重定向的触发点常见于一些跳转参数处,例如:http://www.aaa.com/bbb?url=https://baidu.com,如果成功跳转百度(或其他涉黄涉赌网站),说明url参数存在URL跳转漏洞。

2.URL跳转有四种实现方式

  • a 标签跳转
  • meta 标签内跳转
  • JavaScript 跳转
  • header 头跳转

3.漏洞产生原因

  1. 代码层忽视 URL 跳转漏洞,或不知道/不认为这是个漏洞。
  2. 代码层过滤不严,用去取子串、取后缀等方法简单判断,代码逻辑可以被绕过。
  3. 对传入参数操作(域名剪切/拼接/重组)和判断不当,导致绕过
  4. 原始语言自带的解析 URL,判断域名的函数库出现逻辑漏洞或者意外特性
  5. 服务器/容器特性、浏览器登对标准 URL 协议解析处理等差异性导致被绕过

4.漏洞等级

该漏洞本身是无法直接危害系统和用户安全的,按照通用漏洞定级标准: URL 跳转漏洞属于低危漏洞,但该漏洞可以结合其他漏洞加以深入利用,主要的利用方式不限于钓鱼攻击,在工信部远程检测工作中,该漏洞定义为高危

5.漏洞危害

  • 钓鱼攻击:攻击者可以利用URL重定向漏洞,在看似官方的网站上诱导用户访问涉黄涉赌非法网站、下载恶意软件或执行其他恶意操作等。
  • 窃取用户信息:攻击者可以伪造一个看起来和原网站相似的假冒网站,诱使用户输入敏感信息,如用户名、密码、银行账户等,从而窃取用户的信息。
  • XSS漏洞: 通过 javascript:alert(0) 或 CRLF;
  • 获取用户权限:伪造钓鱼网站、窃取登录凭证 token;
  • 绕过检测:窃取 CSRF token, 绕过 SSRF, RCE 和名单
  • 高级利用方法:配合其他功能 / 漏洞

6.URL重定向漏洞认定标准

  1. 可成功跳转至非法网站、白名单外网站或其他可实行钓鱼攻击、窃取信息等高危行为的仿冒网站。
  2. 是否需要做出除点击链接外的其他操作(如是否存在跳转确认页面等)实现URL重定向。
  3. 可以成功显示跳转页面内容。
  4. 数据包中响应状态码为301、302、307或308。

7.常见的URL跳转代码

Java:

response.sendRedirect(request.getParameter("url"))

PHP:

$redirect_url = $_GET\['url']; header("Location: " . $redirect_url)

.NET:

string redirect_url = request.QueryString["url"]; Response.Redirect(redirect_url);

Django:

redirect_url = request.GET.get("url") HttpResponseRedirect(redirect_url)

Flask:

redirect_url = request.form['url'] redirect(redirect_url)

Rails:

redirect_to params[:url\]

常见的路由参数名:

redirect
redirect_to
redirect_url
url
jump
jump_to
target
to

8.绕过方式

绕过是针对某些开发对有漏洞的参数未完全过滤或控制而进行的,绕过的原理是程序或浏览器对这些特殊符号的解析,可以让URL重定向到我们指定的地址。绕过方式包括不限于:

@ 绕过  
http://xxx.com/?url=http://xxx.com@baidu.com

? 绕过  
http://xxx.com/?url=http://baidu.com?xxx.com

. 绕过  
http://xxx.com/?url=http://xxx.com.baidu.com

# 绕过  
http://xxx.com/?url=http://baidu.com#xxx.com

/ 绕过,可以尝试多个正斜杠一起用,如/、//、///
http://xxx.com/?url=http://baidu.com/xxx.com

\ 绕过  
http://xxx.com/?url=http://baidu.com\xxx.com

双写参数 绕过
http://xxx.com/?url=http://xxx.com&url=http://baidu.com

进制 绕过
http://xxx.com/?url=http://3232235777   
(3232235777为IP地址192.168.1.1的十进制值 以192.168.1.1为例,
把它转为10进制数的公式是:192 * 256^3 + 168 * 256^2 +1 * 256 + 1 * 1 = 3232235777)

9. 前端可能造成漏洞的原因

这个漏洞主要是针对后端 URL 跳转及请求头跳转问题造成的。

  1. 在前端中,如果涉及 redirct=xxxx 的路由(内部实现为 window.open),也会造成这类问题
  2. 前端涉及 富文本/markdown 解析,会解析用户输入的不受信连接 为 a 标签
  3. 前端路由中允许用户创建外链类型的动态路由
posted @ 2023-07-22 19:03  子洋丶  阅读(213)  评论(0编辑  收藏  举报  来源