漏洞简介


URL跳转漏洞,也叫开放重定向漏洞(open redirect) 。CWE-601对该漏洞的描述为:http 参数可能包含一个 URL 值,并可能导致 Web 应用程序将请求重定向到指定的 URL。通过修改恶意站点的 URL 值,攻击者可能成功发起网络钓鱼诈骗并窃取用户凭据。简单说来就是参数可控导致的漏洞产生。

重定向的相关知识


首先需要了解重定向的类型

1.永久重定向

这种方式表示原URL不应再被使用,应该优先选用新的URL。相关的状态码为301(Moved Permanently)、308(Permanent Redirect)

2.临时重定向

有时候请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。相关状态码为302(Found)、303(See Other)、307(Temporary Redirect)

3.特殊重定向

这种方式的状态码为300(Multiple Choice)、304(Not Modified)。

300是手工重定向,用户自行选择web页面展示的重定向链接列表。

304会使页面跳转到本地陈旧的缓存版本当中。

重定向的方法

1.HTTP协议的重定向

也就是上面所说的那些状态码

2.使用HTMl的meta元素进行重定向

<head>
  <meta http-equiv="Refresh" content="0; URL=http://example.com/" />
</head>

这个方式仅适用于html页面

3.借助DOM的js重定向

window.location = "http://example.com/";

这种方法只能在支持js的客户端使用

漏洞原理


说完了重定向的相关知识,现在来说说漏洞的原理。简单来说就是在网页进行重定向的时候,将重定向的目的url修改为攻击者构造的恶意页面,达到钓鱼或者窃取敏感信息等目的。

漏洞产生原因


先贴一张图,网上各篇文章对这个漏洞的原因基本都是这么说的

lua url存在跨站漏洞 url跳转漏洞_重定向

但我觉得最主要的原因还是参数可控,然后服务端又没有对用户输入进行过滤和验证。

那么以下是我收集到的一些可能存在漏洞的参数名称:

redirect

redirect_to

redirect_url

redirectUrl

callback

toUrl

fromUrl

request

oauth_callback

url

go

jump

jump_to

target

service

to

returnUrl

goTo

link

linkto

domain

return

locationUrl

r_url

漏洞危害


1.获取用户权限(伪造钓鱼网站、窃取登录凭证token)

2.绕过检测(窃取CSRF token,绕过SSRF、RCE黑名单)

3.和xss、csrf等漏洞组合扩大危害

挖掘技巧


1.谷歌语法

用inurl:{参数名},可以找出可能存在漏洞的页面,然后进行进一步测试。

2.黑盒测试

黑盒测试的话,除了用上面的谷歌语法,还需要我们留意网站跳转的地方。那么根据常识经验以及我的一些收集整理,这里给出可能存在漏洞的一些功能点:

  • 用户登录、统一身份认证处
  • 用户分享、收藏内容处
  • 跨站点认证、授权后
  • 站内点击其它网址链接时
  • 注册、注销、修改密码处
  • 账号切换、保存设置处

3.白盒审计

如果是审计代码,那么下面给出的是我收集的不同语言可能产生漏洞的地方

java

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

PHP

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

.NET

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

Rails

redirect_to params[:url]

Django

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

Flask

redirect\_url = request.form\['url'\] redirect(redirect\_url)

4.fuzz测试

可以用下面提供的payload进行测试,注意使用的时候需要修改一下相关url

https:///cujanovic/Open-Redirect-Payloads/blob/master/Open-Redirect-payloads.txt

绕过方式


1.问号绕过
格式:http://www.aaa.com/bbb?url=http://ccc.com?aaa.com
注意:一定要带上aaa.com
跳转后的url是http://ccc.com?aaa.com

2.利用反斜杠和正斜杠和点绕过
正斜杠
格式1:http://www.aaa.com/bbb?url=http://ccc.com/aaa.com
反斜杠
格式2:http://www.aaa.com/bbb?url=http://ccc.com\aaa.com
" . ":
格式3:http://www.aaa.com/bbb?url=http://ccc.com.aaa.com

3.利用@绕过
格式:http://www.aaa.com/bbb?url=http://aaa.com@ccc.com

4.利用白名单缺陷绕过
白名单的限制往往是不全面的。
例如该网站想跳转到自己的内部页面,而只检查跳转url中有没有白名单的内容。那么:http://www.aaa.com/bbb?url=http://cccaaa.com
购买cccaaa.com的域名,这样也是可以绕过的。

5.多重验证&跳转绕过
现在很多网站都有多重验证,比如你登陆账户后会出现另一个验证页面,输入手机验证码进行验证,此时这上面的URL很可能存在任意跳转的问题。
比如http://www.aaa.com/acb?Url=http: … ttp://
当然,还有多重的,结构的多重跳转你修改最后面的URL就可以达到任意URL跳转,中间的URL就没必要动了。

6.点击触发实现绕过
很多登陆页面的地方,其URL是一个跳转的URL
如某一个登录页面,修改url:http://www.aaa.com/bbb?url=http://ccc.com
登录用户,有可能触发。

7.利用绕过
格式:http://www.aaa.com/bbb?url=http://www.aaa.com.ccc.com.
但是没有成功,暂且保留。

8.利用超链接绕过可信站点限制
比如一个URL,它是可以直接跳转的,但是一般测试跳转时大家习惯用www.baidu.com或这样的可信站点进行测试,但是有些网站是可以跳转这些网站的。
只要是可信站点且常用,基本都可以跳转,那么这就属于正常的业务逻辑了,难度就这样错失一个URL跳转漏洞了?
其实不然,只要你的URL被百度收录过,那么直接搜索你的域名,site:xxx.xxx
因为你在百度里点击你的域名,它会先是一个302跳转,而这个302跳转就是百度下的302跳转,那么这样就可以绕过可信站点的限制,从而达到跳转到指定URL。
当然,百度这个302有点长,你给它进行加密就行。
利用百度缓存链接,在其上再进行跳转

9.POST参数中的URL跳转
常见于上传图片、头像处。如果过滤不严,将会把图片的完整地址包含在POST参数里,这里我们修改其地址为ccc.com。
由于修改了地址,图片就会显示不出来,右键查看图片,就会触发URL跳转(可以配合其他绕过方式)
如果POST参数里就只是URL跳转参数,那么你可以给它转成GET方式,然后进行跳转就可以了,只要网站支持这样的GET方式就行。在Burp Suite里可以一键转换提交方式,右键选择Change request method就可以!

10.利用#号绕过
格式:http://www.aaa.com/bbb?url=http://ccc.com#aaa.com

11.其他绕过思路

1. 跳转到IP地址,而不是域名; 
2. 跳转到IPV6地址,而不是IPv4地址; 
3. 将要跳转到的IP地址用10进制、8进制、16进制形式表示; 
4. 更换协议,使用ftp、gopher协议等; 
5. 借鉴SSRF漏洞绕过的tricks; 
6. CRLF注入不能xss时,转向利用任意URL跳转漏洞;

修复方式


1.使用白名单

2.在可能的情况下,让用户提供在服务器端映射到完整目标 URL 的短名称、ID 或令牌

3.不允许将 URL 作为目标的用户输入

4.如果无法避免用户输入,请确保提供的值有效、适用于应用程序,并且已为用户授权

5.从应用程序中删除重定向功能,并将指向它的链接替换为指向相关目标 URL 的直接链接

总结


以上就是关于url跳转漏洞的一些相关内容。这个漏洞是属于比较好理解的,适合刚入门的新手学习。这个漏洞本身是低危的,当在渗透测试时如果发现存在这个漏洞的时候,不妨看看有没有机会和其他漏洞配合扩大攻击。

参考链接