当 CTF 遇上漏洞赏金:Opera 浏览器中的一个严重 UXSS

215 阅读1分钟

官网:http://securitytech.cc/

当 CTF 遇上漏洞赏金:Opera 浏览器中的一个严重 UXSS

2023 年 9 月 25 日,我所在的团队 Super Guesser 正在韩国参加 WACON CTF 2023 线下总决赛。我设计了一道浏览器挑战题 “operaaa”:在最新版 Opera 中的一个存在漏洞的扩展。目标是什么?泄露其他已打开标签页的完整 URL。你仍然可以在 这里 试一试。

这是一道很难的题目,只有一支队伍解出来,就是 @jinu。预期解题路径是:

  1. 通过绕过 URL 检查在扩展中触发 XSS。
    1. 从 iframe 沙箱中逃逸。
    1. 找到一个隐藏的 Opera 域(不包含 “opera”),该域能访问 chrome.tabs()。
    1. 泄露已打开标签页的 URL(包含 flag)。

但赛后我发现 jinu 的解法完全是非预期的。他直接打到了一个带有 chrome.tabs() 访问权限的 Opera 特殊域上的 XSS。这一发现让我们从 CTF 题目转向了 真实的漏洞赏金:Opera 本身的一个严重 UXSS。

严格来说,这个 XSS 本来只是在 (gx.games) 域上的一个普通 WebView 漏洞,如果直接报告,大概能拿到 $300。但因为它能访问 chrome.tabs(),我们可以泄露任意 URL,甚至劫持任何基于 OAuth 的账号。以下是漏洞报告:

简介

我和 @jinu 一起研究 Opera 浏览器时,发现了 GX.games 里的一个严重 XSS,可以泄露其他来源的 URL 和用户隐私信息。再结合一个 OAuth 的小技巧,我们能够接管所有使用 OAuth 的网站账户。

XSS 发现

我们在 GX.games 上寻找漏洞时,发现了这个 URL: https://gx.games/signup/

研究参数时,发现了 redirectUrl,于是我们试着把它放进 URL:

gx.games/signup/?red…

按回车或点击以查看完整图片

结果惊讶地发现,它真的跳转到了 example.com。那我们再尝试另一种 scheme —— javascript。在浏览器里 location='javascript:alert(origin)' 等价于 eval(code),于是试试:

gx.games/signup/?red…

按回车或点击以查看完整图片

很好,我们拿到了完整 XSS,用户不需要任何操作。由于这个域归 Opera 所有,它可能比普通页面有更高的权限。

opr 对象

我们查看了特殊的 opr 对象,发现它包含多个敏感功能,例如:显示反馈框、泄露登录用户的隐私信息、修改工作区、改变浏览器壁纸。

这些功能本不该被普通页面访问,非常关键。我们重点关注 opr.operaIdentityPrivate,看看能用来做什么。用如下代码,我们可以泄露当前浏览器登录用户的姓名和邮箱:

opr.operaIdentityPrivate.getFullname((x)=>{
opr.operaIdentityPrivate.getUseremail((j)=>{
alert('你的姓名和邮箱是: '+x+'  '+j)
})
})

按回车或点击以查看完整图片

URL 泄露

进一步研究时,我们查看了 chrome 对象,发现它同样有一些危险能力。

按回车或点击以查看完整图片

重点关注 chrome.tabs。这组函数非常强大,可以跨域获取标签页的 URL 和标题。官方文档

利用 chrome.tabs.query,我们能获取浏览器中所有已打开的标签页,并访问它们的 URL 和标题。这是对浏览器安全模型的严重破坏。

从 URL 泄露到账号接管

真正的危险来自于把这个漏洞和 Opera 的 OAuth 流程(或任何 OAuth 应用) 链接起来。

Opera Sync 登录使用:

https://auth.opera.com/account/confirm-identity?...&state=<value></value>

按理说,OAuth 的 state 用来防止 CSRF。但这里的攻击手法是:

  • 攻击者生成自己的 state
    • 受害者登录,并被重定向回来,URL 中带有 code + 受害者账号
    • 因为 state 不匹配,受害者看到报错。
    • 但利用 chrome.tabs,我们能窃取完整的重定向 URL(包含 code)。
    • 攻击者在自己浏览器里使用这个 URL,就能登录到受害者的 Opera Sync 账号。

这意味着可以完全接管浏览记录、会话,甚至——由于 OAuth 的普遍性——潜在地接管 Google、Facebook、Twitter 或任何使用 OAuth 的网站账户

POC

chrome.tabs.create({
url:`https://auth.opera.com/account/confirm-identity?...&state=#Attacker_State`
});
setTimeout(()=>{
chrome.tabs.query({},(tabs)=>{
document.body.innerHTML = `
<h1 style="color:red">
pwned! 用这个 URL 登录受害者账号:<br />
<textarea cols="50" rows="10">${tabs[tabs.length-1].url}</textarea>
</h1>
`
})
},9000)

影响

  • 受影响范围: Opera(PC、Mac、Linux)+ Opera GX(PC、Mac、Linux)
    • 严重性: 严重(跨域 URL 泄露 + OAuth 账号接管)
    • 更广泛风险: 打破同源策略,破坏全网的 OAuth 保护。

时间线

  • 发现时间: 2023 年 9 月 26 日
    • 修复时间: 2023 年 10 月 13 日
    • 奖励发放: 2024 年 1 月 12 日 —— 每人 $4,000

公众号:安全狗的自我修养

vx:2207344074

Gitee:gitee.com/haidragon

GitHub:github.com/haidragon

Bilibili:haidragonx