什么是ReDoS?

基础知识

更全面的学习参考菜鸟教程:正则表达式教程

重复运算符

+是重复运算符,可代表某个字符或某个模式的重复。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoetu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值