挖洞经验 | 从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 漏洞利用步骤

  1. 创建报告并将名称设置为恶意payload:{{constructor.constructor('alert("XSS")')()}}
  2. 通过邮件功能发送报告
  3. 受害者点击邮件中的取消订阅链接
  4. XSS payload在受害者浏览器中执行

3. 技术要点分析

3.1 AngularJS XSS构造技术

  • 利用AngularJS的表达式注入:{{}}语法
  • 通过constructor链执行任意JavaScript代码:
    {{constructor.constructor('alert("XSS")')()}}
    
  • 这种技术绕过常规HTML编码防护

3.2 漏洞升级的关键因素

  1. 输入点:报告名称字段接受用户输入
  2. 存储点:名称被存储在服务器端
  3. 输出点:取消订阅页面未正确编码输出
  4. 触发条件:无需认证即可访问的取消订阅链接

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. 经验总结

  1. 技术针对性:针对特定技术(如AngularJS)寻找特定漏洞
  2. 深度挖掘:不满足于表面发现,探索漏洞升级可能性
  3. 数据流追踪:完整追踪用户输入的处理流程
  4. 边缘功能测试:重视看似次要的功能(如取消订阅链接)
  5. 学习借鉴:通过研究公开报告获取新思路

此案例展示了如何通过系统化的思考和深入探索,将看似低危的Self XSS升级为高危的存储型XSS,为安全研究人员提供了宝贵的漏洞挖掘思路。

从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代码: 这种技术绕过常规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,为安全研究人员提供了宝贵的漏洞挖掘思路。