TL;DR
数月前在某公开漏洞赏金项目中,作者发现了一个精妙的漏洞链,包含:
- 不安全的message事件监听
- 粗糙的JSONP端点
- WAF绕过技巧
- 范围外子域的DOM型XSS
- 过度宽松的CORS配置
这些漏洞最终组合实现了对范围内资产的CSRF攻击。本文将深度剖析这个攻击链的技术细节。
寻找棘手的CSRF漏洞
目标赏金项目的范围仅限于www.redacted.com
及其少数子域。当常规测试思路枯竭时,作者注意到inscope.redacted.com
等子域会向https://www.redacted.com/api
发送包含敏感操作(如更新用户资料)的POST请求。这些请求依赖标记为SameSite=None
和Secure
的sid
cookie进行认证,但作为CSRF防护,端点要求查询参数中包含与会话绑定的csrftoken
。
宽松的CORS策略突破范围限制
测试发现https://www.redacted.com/profile
端点的CORS配置不仅允许https://in-scope.redacted.com
,还接受任意redacted.com
子域的请求:
|
|
范围外子域的不安全消息监听
使用postMessage-tracker插件发现https://out-of-scope.redacted.com/search
存在未做来源检查的message事件监听器,其处理逻辑会:
- 解析事件数据为JSON对象
- 按点号分割method属性
- 递归访问window.APP对象的嵌套属性
- 调用最终获得的函数并传入arg参数
粗糙的JSONP端点导致DOM型XSS
window.APP.apiCall
函数用于向https://search.redacted.com
的JSONP端点发送请求,但存在两个关键问题:
- URL构造不安全
- 回调参数验证存在缺陷
通过双重URL编码可绕过Akamai WAF防护:
|
|
组合利用实现一键CSRF
最终攻击流程:
- 诱导用户点击恶意页面按钮
- 弹出窗口打开目标页面
- 通过postMessage触发JSONP请求
- 利用XSS窃取CSRF令牌
- 伪造用户资料更新请求
攻击页面核心代码:
|
|
后续
虽然漏洞链技术复杂度高(CVSS 7.1 High),但最终仅获得200欧元奖励。这反映出某些赏金项目对复杂攻击链的价值评估可能存在偏差。