挖洞经验 | 从Self XSS到有趣的存储型XSS
字数 1370 2025-08-18 11:37:50
从Self XSS到存储型XSS的漏洞挖掘与利用技术
1. 漏洞背景与发现过程
1.1 初始探索
- 目标网站使用AngularJS框架
- 常规XSS测试未果,所有输出点都进行了正确编码
- 发现AngularJS模板注入点:
{{4*4}}可执行并返回16
1.2 Self XSS的发现
- 构造AngularJS XSS payload:
{{constructor.constructor('alert("XSS")')()}} - 确认存在XSS漏洞,但属于Self XSS(仅影响攻击者自身)
1.3 漏洞升级的关键突破
- 发现网站具有"通过电子邮件发送报告"功能
- 报告可自定义名称,且名称字段存在Self XSS漏洞
- 报告通常需要认证才能查看,看似无法影响其他用户
2. 漏洞利用链构建
2.1 关键发现点
- 报告邮件中包含"取消订阅"链接
- 取消订阅页面无需认证即可访问
- 取消订阅页面会显示报告名称且未对AngularJS模板进行编码
2.2 漏洞利用步骤
- 创建报告并将名称设置为恶意payload:
{{constructor.constructor('alert("XSS")')()}} - 通过邮件功能发送报告
- 受害者点击邮件中的取消订阅链接
- XSS payload在受害者浏览器中执行
3. 技术要点分析
3.1 AngularJS XSS构造技术
- 利用AngularJS的表达式注入:
{{}}语法 - 通过constructor链执行任意JavaScript代码:
{{constructor.constructor('alert("XSS")')()}} - 这种技术绕过常规HTML编码防护
3.2 漏洞升级的关键因素
- 输入点:报告名称字段接受用户输入
- 存储点:名称被存储在服务器端
- 输出点:取消订阅页面未正确编码输出
- 触发条件:无需认证即可访问的取消订阅链接
3.3 漏洞危害
- 存储型XSS,影响所有点击取消订阅链接的用户
- 可窃取用户凭证、会话信息
- 可进行钓鱼攻击或传播恶意软件
4. 漏洞挖掘方法论
4.1 技术栈分析
- 识别网站使用的技术框架(如AngularJS)
- 研究框架特有的漏洞模式(如模板注入)
4.2 攻击面扩展
- 不满足于Self XSS,寻找可能的升级路径
- 关注所有数据流:输入→存储→输出→触发条件
- 特别注意无需认证的公开端点
4.3 学习资源利用
- 研究已公开的漏洞报告(如HackerOne披露案例)
- 学习特定技术的攻击手法(如AngularJS模板注入)
5. 防御建议
5.1 开发人员防护措施
- 对所有用户输入进行严格的输出编码
- 禁用AngularJS的表达式执行:
$sceProvider.enabled(false) - 实现内容安全策略(CSP)限制脚本执行
5.2 安全测试要点
- 测试所有无需认证的公开端点
- 验证所有用户可控数据的完整处理流程
- 特别注意邮件系统、导出功能等间接输出点
6. 经验总结
- 技术针对性:针对特定技术(如AngularJS)寻找特定漏洞
- 深度挖掘:不满足于表面发现,探索漏洞升级可能性
- 数据流追踪:完整追踪用户输入的处理流程
- 边缘功能测试:重视看似次要的功能(如取消订阅链接)
- 学习借鉴:通过研究公开报告获取新思路
此案例展示了如何通过系统化的思考和深入探索,将看似低危的Self XSS升级为高危的存储型XSS,为安全研究人员提供了宝贵的漏洞挖掘思路。