初识URL重定向漏洞

百家 作者:OPPO安全应急响应中心 2019-09-27 05:52:59

1

以上文章由作者【撕夜】有赏投稿,也欢迎广大朋友继续投稿,详情可点击OSRC重金征集文稿!!!了解~~


简介

URL重定向/跳转漏洞,顾名思义就是服务端对用户通过某参数传入的url变量未进行检查和控制或过滤规则不够严谨,最终导致跳转至恶意地址。危害显而易见,跳转到攻击者控制的网站可利用钓鱼获取用户的个人信息和登录凭证等。(虽然低危奖金较低,但是一旦找到突破点几乎整站url跳转都可bypass)

漏洞场景

以下内容根据本人在src中遇到的实际情况进行分析。

漏洞成因

一般通过以下几种方式实现URL跳转:

META标签跳转

javascript跳转(某些情况下可以实现xss)

header跳转

URL可控会将用户的浏览器从可信站点转至不可信站点,若跳转同时附带了某些敏感数据(如用户登陆凭证,以下实例将会遇到)可泄露给攻击者。

php中典型的登录跳转实例:

php< ?php
$url = $_GET['goto'];header("Location: $url");

如果goto参数没有任何限制,攻击者可以将以下链接发给某用户来实现钓鱼等目的。

http://www.urlredirect.com/login.php?goto=http://hack.com
****

以下为实际漏洞挖掘时遇到的情况:


1. 用户可控参数无任何过滤,可直接跳转至任意网站。
2. 限制url为可信任地址,可利用white.com@baidu.com等其他方式绕过。
3. 未限制http/https协议但是限制url形式需为:www.xxsrc.com/dir/。
   可利用///www.xxsrc.com/../a.com绕过
4. url白名单,此时可通过目标网站的其他可绕过或无限制的url跳转进行利用。

常见的参数名

returnUrlredirectredirectUrlredirectPathgotototargeturlreurlnextjumpUrltargetlinktolink

通常发生漏洞的位置

1. 用户注册、登录、退出登录等位置,认证完成后会跳转(很常见)
2. 站内友情链接及点击其他网址链接时
3. 网站报错页面,可能会跳转至前一页面


浏览器是如何对URL进行解析的

URL组成结构

第一部分:协议名(以单个冒号结束)
第二部分:用户信息 也就是账号密码!(登陆ftp时常用)
第三部分:主机名(域名)
第四部分:端口
第五部分:查询 
第六部分:片段ID

分析

此处只对一些不常见问题做一些简单的分析。

1. 以”?“,”#“,”/“为分隔符提取信息。

举个例子

http://xxsrc.com&par=test@www.baidu.com

由于浏览器提取协议名完成后,剩下部分并无以上提到的三个符号,因此浏览器无法获得一个字符串来获得主机地址,而后面存在@符号便被认为@之前的是认证信息,因此将访问www.baidu.com。

#以开头的php代码为例,尝试访问以下链接:

localhost/index.php?goto=http://www.baidu.com^parm=test@evi1.cn

注:不同浏览器处理不同,在chrome中将直接访问evi1.cn而firefox中会提示以www.baidu****登录evi1.cn网站。

2. 浏览器可接受的url格式

   /www.baidu.com/   //www.baidu.com/   ///@www.baidu.com/   诸如以上形式,@符号可有可无,起始位置反斜线可多可少。   http://baidu.com   http:\//baidu.com   //baidu.com

利用方法

一些案例

1. 没有做任何限制,参数后直接跟恶意网址即可(某edusrc)

#登录后跳转http://*.***.edu.cn/RSP/PC/Account/Login?reurl=http://www.baidu.com

2. 协议限制

#只要url地址含有http/https即可http://xxsrc.com/redirect.php?url=https://www.baidu.com

3. 域名字符串检测

1) 字符串中存在白名单域名即跳转
//伪代码如下

< ?php$url = $_GET['url'];if(strstr($url,"www.**src.com") !== false){    header("Location: " . $url);}else{    die("Forbidden");}#bypasshttps://www.**src.com/redirect.php?url=http://www.**src.com.www.attacker.com/

2) 结尾为白名单域名即跳转

#bypasshttps://www.**src.com/redirect.php?url=http://www.attacker.com/www.**src.com或者购买xxx**src.comhttps://www.**src.com/redirect.php?url=http://www.attacker.com/www.xxx**src.com

3) 白名单站点多次重定向
#某src实例



4) 畸形地址绕过
案例一:某src实例

可以理解为,////www.src.com/被当成目录,在进行location或其他处理跳转时被后面的../跳过,直接访问后续url。

案例二:hackerone一个有趣的[案例]

1. 利用“#”绕过

http://localhost/redirect.php?url=http://evi1.cn#baidu.com/

2. 利用“@”绕过

http://localhost/redirect.php?url=http://baidu.com@evi1.cn

3. 利用“?”绕过

http://localhost/redirect.php?url=http://evi1.cn?www.baidu.com

4. 利用“.”绕过

http://localhost/redirect.php?url=http://evi1.cn.www.baidu.com

5. 重复特殊字符

http://localhost/redirect.php?url=////baidu.com/../www.evi1.cn

6. 白名单字符串

http://localhost/redirect.php?url=http://evilbaidu.com

其他bypass思路

之所以说其他其实只是可以实现的一些姿势,但在本人挖掘漏洞过程中并未实际成功利用过。

1. 利用ip而非域名绕过
2. 利用""绕过 
eg:http://localhost/redirect.php?url=http://evi1.cnwww.baidu.com
3. 利用十进制、八进制、十六进制等ip方式
4. 利用ipv6而非ipv4地址

修复方案

1.使URL跳转参数用户不可控

2.跳转地址采用白名单机制

3.合理的校验跳转目标地址,非己方地址时提醒用户注意风险



关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接