基础知识
更全面的学习参考菜鸟教程:正则表达式教程
重复运算符
+
是重复运算符,可代表某个字符或某个模式的重复。
ca+t //匹配 caaaat
此外,还有另一个重复运算符*
。它和+之间唯一的区别是:+
代表重复一次多次,*
代表重复零次或多次。
ca*t // 将同时匹配 caaaat和ct
ca+t // 将匹配caaaat 但不会匹配ct
贪婪匹配和非贪婪匹配
贪婪匹配
x.*y
表达式如果对字符串axaayaaya
进行处理,就会返回xaayaay
。
非贪婪匹配
通过使用运算符?
指定其进行非贪婪匹配,此时表达式为x.*?y
x.?*y
表达式如果对字符串axaayaaya
进行处理,就会返回xaay
。
计算(回溯)
x*y表达式对字符串xxxxxxxxxxxxxx
进行匹配,直接就可以看出匹配无结果。
但是计算机的正则表达式引擎将会执行以下操作:
但是这只是第一步!
接下来正则表达式引擎将从第二个x开始匹配,然后是第三个,然后是第四个,依此类推到第14个x。
最终总步骤数为256。
同样,如果你使用非贪婪匹配,x*?y
表达式会从一个字母开始匹配,直到尝试过所有的可能,这和贪婪匹配一样愚蠢。
举例:潜在攻击点
多个重复运算符1
如果两个重复运算符相邻,那么也有可能很脆弱。
表达式: .*\d+.jpg
Motive: 会匹配任意字符加上数字加上.jpg
匹配字符串:1111111111111111111111111 (25 chars)
计算步骤数: 9187
它没有前一个那么严重,但如果程序没有控制输入的长度,它也足够致命。
多个重复运算符2
如果两个重复运算符较为相近,也有可能受到攻击。
表达式: .*\d+.*a
Motive: 会匹配任意字符串加上数字加上任意字符串加上a字符
匹配字符串: 1111111111111111111111111 (25 chars)
计算步骤数: 77600
多个重复运算符3
|
符号加上[]
符号再配上+
也可能受到攻击。
表达式: (\d+|[1A])+z
Motive: 会匹配任意数字或任意(1或A)字符串加上字符z
匹配字符串: 111111111 (10 chars)
计算步骤数: 46342
参考资料
https://nosec.org/home/detail/2506.html