原文:http://homakov.blogspot.hk/2013/12/regexp-groups-overflow-in-ff.html

分组(子表达式)在Firefox中只要匹配到999 998個以上就會產生一種類似「溢出」的現象,不論匹配與否皆返回false

文中給出了簡單的測試:

In Chrome

z=Array(999999).join('a');
console.log(/^([\w])+$/.test(z),z.length);
//true 999998

z=Array(999999+1).join('a');
console.log(/^([\w])+$/.test(z),z.length);
//true 999999


In FF

z=Array(999999).join('a');
console.log(/^([\w])+$/.test(z),z.length);
//true 999998

z=Array(999999+1).join('a');
console.log(/^([\w])+$/.test(z),z.length);
//false 999999

這現象或許能提供bypass的新思路,例如基於正则判斷的XSS filter

考慮以下判斷XSS的代碼

var input = '<'+Array(999999+1).join('a')+'<script>';

if (/<(.)+>/g.test(input)) alert('XSS detected!!');

只有Firefox不會彈出alert,也就是成功繞過

[原文地址]

相关讨论:

1#

mramydnei | 2013-12-24 16:52

今天早上才看到,m.facebook.com取location.hash的那个正则吧

2#

xsjswt | 2013-12-24 17:35

对replace有效么,很多不是会发现这些就不执行,而是会直接replace掉

3#

/fd (/proc) ‫() | 2013-12-24 17:48

@xsjswt 有效

4#

xsser (十根阳具有长短!!) | 2013-12-24 18:03

擦 用底层漏洞来配合应用利用

5#

xsjswt | 2013-12-24 18:40

@xsser 一下子就有好多xss了,现在

6#

xsjswt | 2013-12-24 18:44

@xsser 不过就是url里面很难写这么多个字符

7#

xsjswt | 2013-12-24 19:00

@xsser 刚试了一个应该因为这个存在xss的点,火狐直接死掉

8#

xsjswt | 2013-12-24 19:00

@xsser 我是把999999个字符写在#后面,当location.hash的

9#

Chu (学习ing。) | 2013-12-25 01:07

nice~

10#

Chu (学习ing。) | 2013-12-25 01:32

ff26.0 ubuntu13.10 进行replace 测试,没成功呀...

11#

xsjswt | 2013-12-25 10:23

@Chu ff 27 win7 64,确实不会replace掉,直接把原串返回回来了

12#

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2013-12-25 10:29

Very Nice, Mark!