重做 表示正则表达式拒绝服务。重做是一种算法复杂度攻击,会产生 拒绝服务 通过提供 正则表达式 这需要很长时间来评估。该攻击利用了一个事实,即大多数正则表达式实现在最坏情况下具有指数时间复杂性,因此对于较大的输入字符串(“邪恶的正则表达式”),正则表达式引擎查找匹配项所需的时间呈指数增长。
攻击者的目的是提供这样的正则表达式,从而使其需要无限的计算时间,这反过来会减慢应用程序的速度或使其完全崩溃。 因此,这种攻击基本上利用了这样一个事实,即正则表达式引擎将尝试所有可能的字符排列和组合,以找到匹配项。
正则表达式可以在整个web上找到,重做攻击可以用来攻击web的各种组件。
重做攻击的示例表达式
正则表达式: ^((ab)*)+$(这个正则表达式搜索ab及其重复) 输入: 阿巴巴 在这种情况下,regex引擎将在第一次尝试中找到匹配项,因为ababab匹配regex模式。现在我们可以很容易地把阿巴巴作为输入,使事情复杂化。这个额外的a最终将导致各种各样的问题,因为它与模式不匹配,并且它将使正则表达式引擎运行各种各样的排列以寻找可能的匹配。
(ababab) - NOT A MATCH(abab)(ab) - NOT A MATCH(ab)(abab) - NOT A MATCH(ab)(ab)(ab) - NOT A MATCH()(ababab) - NOT A MATCH()(abab)(ab) - NOT A MATCH()(ab)(abab) - NOT A MATCH()(ab)(ab)(ab) - NOT A MATCH
你可以在网上自己试试 正则表达式编辑器 .现在想象一下,如果输入的时间更长
abababababababababababababababababababababababababab......
它会造成什么样的破坏。
邪恶的正则表达式
它们是使应用程序易受重做攻击的正则表达式,只要出现以下因素,它们就会出现:
- 正则表达式将重复(“+”、“*”)应用于复杂的子表达式
- 对于重复的子表达式,存在一个匹配项,它也是另一个有效匹配项的后缀。
恶意正则表达式的示例包括:
- (a+)+
- ([a-zA-Z]+)*
- (a | aa)+
- (a | a?)+
- (.*a){x}x>10
通过Evil Regex攻击Web应用程序:
- 打开JavaScript并找到邪恶的正则表达式
- 为找到的正则表达式手工创建恶意输入,并通过拦截代理提交有效值
- 将请求更改为包含恶意输入,就可以进行重做攻击
通过Regex注入重做
下面的示例检查用户名是否是用户输入的密码的一部分。
String userName = textBox1.Text;String password = textBox2.Text;Regex testPassword = new Regex(userName);Match match = testPassword.Match(password);if (match.Success){MessageBox.Show("Do not include name in password.");}else{MessageBox.Show("Good password.");}
如果攻击者进入 ^([a-z])+)+[A-Z]([A-Z])+$ 作为用户名和 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! 作为密码,程序将挂起。
预防:
- 在正则表达式中使用原子分组。原子组是一个组,当正则表达式引擎退出时,它会自动丢弃组内任何令牌所记住的所有回溯位置
- 如果正则表达式花费的时间太长,请立即杀死它,并通知用户正则表达式花费的时间太长。
- 预处理/验证正则表达式,或者让人们直接搜索文本,而不是直接输入正则表达式。
参考资料:
- https://www.linkedin.com/pulse/redos-attacks-python-application-architectures-akshat-mahajan
- http://stackoverflow.com/questions/12841970/how-can-i-recognize-an-evil-regex
- https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
- 图片来源:https://www.owasp.org/index.php/Main_Page
本文由 帕拉什尼甘酒店 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。