原文: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!