0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

正则表达式是什么 如何能导致拒绝服务攻击

马哥Linux运维 来源:马哥Linux运维 作者:子沐爱扫地 2022-05-13 16:38 次阅读

介绍

当您想到拒绝服务攻击时,您会想到什么?可能是一大群机器人试图访问 Web 服务器的资源以使其瘫痪。好吧,这肯定是导致拒绝服务攻击的一种方式。但是,还有一种您可能没有听说过的方式。它被称为 ReDoS,是由正则表达式引起的。

正则表达式?但这怎么可能呢?那不是通过使用过滤器来匹配字符串、将字符串列入白名单和黑名单,从而使我们的工作更轻松吗?是的,但是攻击者也可以利用它来使应用程序(服务器)屈服。让我们了解如何!

正则表达式是什么?

021448ee-d067-11ec-bce3-dac502259ad0.png

简而言之,正则表达式是一种用于匹配(编程语言中)字符串的模式。让我们通过一个示例来理解它吧,该示例是“用正则表达式在服务器端验证电子邮件地址”。

letregex=newRegExp('[a-z0-9]+@[a-z]+.[a-z]{2,3}');
lettestEmails=["notanemail.com","workingexample@email.com","another_working@somethingelse.org","notworking@1.com"];
testEmails.forEach((address)=>{
console.log(regex.test(address))
});

上面是一段 JavaScript 代码(译者注:不会 JS 也无妨,对阅读本文的影响不大,请继续阅读)。我们在这里使用的正则表达式是 [a-z0–9]+@[a-z]+.[a-z]{2,3}。我们提供了几个电子邮件地址,然后我们需要检查它们是否遵循电子邮件地址的一般模式。让我们分解一下正则表达式。

  • [a-z0–9]+:表示此处的字符串可以是任何小写字母和数字。末尾的加号 (+) 表示必须至少有一个字符(无论是小写字母还是数字)。

  • @:表示此处应该有 AT(@)符。

  • [a-z]+:表示此处字符串应该包含(一个或多个)小写字母的字符

  • .:表示此处应该有一个点(.)

  • [a-z]{2,3}:表示此处字符串是由小写字母组成的,但其长度只能是 2 或 3。

让我们将其与我们选择的电子邮件 ID 进行比较。让电子邮件 ID 为 yourremail12@yahooemail.com

  • youremail12@ 对应于 [a-z0-9]+@
  • yahooemail 对应于 [a-z]+
  • .com 对应于 .[a-z]{2,3}

这通常是正则表达式的工作方式。但这不是会按预期工作吗?这如何能导致拒绝服务攻击呢?让我们了解一下。

正则表达式由正则表达式运算器处理。在 ReDoS 攻击期间,攻击者通过提供输入字符串强制正则表达式运算器陷入循环。当它处于循环中时,正则表达式运算器可能会花费大量时间,并消耗大量资源。这会导致其他合法客户端无法使用资源,并可能导致 Web 服务器和应用程序无响应并最终崩溃。

另一种情况可能是设计不良的正则表达式模式,这可能导致输入验证失败,在正则表达式运算器解析时会消耗大量时间等。

有害正则表达式(Evil Regex)

有害正则表达式模式是攻击者可以利用的正则表达式。根据 Wikipedia,这些是有害正则表达式模式的特征。

  • 正则表达式将重复(+*)应用于复杂的子表达式。
  • 对于重复的子表达式,存在一个匹配,同时该匹配也是另一个有效匹配的后缀。

这说明了如果已经有一个复杂的子表达式,并且应用一些像 +* 这样的贪婪运算符,可能会导致一个有害的正则表达式。

例如,

我们考虑以下正则表达式:^(a+)+$

^$ 定义了字符串必须分别以 a 开头和结尾。

如果我们提供 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,正则表达式运算器将在几毫秒内处理它并返回 True

如果我提供 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!,你觉得会发生什么!

如果您运行它,则对于所提供的正则表达式,(在返回 False 之前)需要花费大约 2 秒的时间来处理。只是通过添加一个额外的感叹号会导致这么长的时间吗?

让我们从正则表达式运算器的角度来看看它是如何工作的。正则表达式运算器直到达到感叹号之前将会正常工作。由于我们没有指定查找 (!) 标记,因此它会回溯到前面的字母,并查看是否有另一种方法来解析先前的字符,以便可以验证整个字符串。在它最终发现绝不会返回 True 之前,这样的回溯将会一直持续下去

如您所知,回溯会导致大量时间消耗。攻击者可以使用它来利用有害正则表达式模式。


译者注

看完上述内容后,有些读者可能仍对刚才的示例(回溯)表示不解。为了让读者能够更加清晰地了解其原理,我将上例中正则表达式运算器可能将执行的步骤进行了分解演示。

下列演示的过程只是存在的一种可能(实际情况取决于正则表达式引擎的实现)

回溯次数 解析结果
0 {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
1 {aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}, {a}
2 {aaaaaaaaaaaaaaaaaaaaaaaaaaaa}, {aa}
3 {aaaaaaaaaaaaaaaaaaaaaaaaaaaa}, {a}, {a}
4 {aaaaaaaaaaaaaaaaaaaaaaaaaaa}, {aaa}
5 {aaaaaaaaaaaaaaaaaaaaaaaaaaa}, {aa}, {a}
6 {aaaaaaaaaaaaaaaaaaaaaaaaaaa}, {a}, {aa}
7 {aaaaaaaaaaaaaaaaaaaaaaaaaaa}, {a}, {a}, {a}
8 {aaaaaaaaaaaaaaaaaaaaaaaaaa}, {aaaa}
... ...
2147483647 {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}, {a}

从上面的表格可以看出,正则引擎可能会做出 (近 20 亿)种解析结果。

也就是,对于示例给出的有害正则表达式和恶意字符串。如果按照我们的演示进行,设有效最长子串的长度为 ,那么回溯时间复杂度为(证明过程略,感兴趣的读者可去探究帕斯卡三角形)。该时间复杂度是指数级别,多么可怕的时间复杂度级别啊!

对于 30 个 a,仅多出一个感叹号,执行时间竟然多出约 20 亿倍。当然了,这里仅是一种可能的演示,在作者示例中的时间仅多了千倍左右。这可以从很多方面解释,例如正则引擎的某些优化,或比例受某些较长固定执行时间的支配等。

译者注结束


可利用性

开发人员和我们一样都是人类,因此都会出错。他们创建的许多应用程序可能会包含可利用的正则表达式模式。对于有经验的黑客或安全专家来说,正则表达式模式很容易被猜到,而在有些情况下,源代码是可以在线获得的。攻击者可以利用这一点来谋取利益,并可能降低被攻击者的利益。

糟糕的正则表达式模式也可能会导致绕过许多安全控制,无论是在 Web 应用程序还是网络防火墙上。

因此,始终建议在将应用程序部署到生产环境之前正确测试正则表达式模式。

缓解措施

  • 缓解这种情况的最佳方法是根本不去使用它。尤其当你是新手时。

  • 如有必要,请使用安全的正则表达式。这样只需寻找另一种替换方法来完成相同的输出。

  • 在使用正则表达式之前,请在 regex101.com 或其他在线资源等网站上测试它们。

  • 安全扫描用户输入永远不会过时。

  • 现在存在着很多正则表达式运算器。我建议您使用更高效的正则表达式引擎。你可以看看 https://github.com/google/re2

  • 测试您是否正在使用易受攻击的正则表达式引擎或运算器。例如,url-regex 是一个用于测试匹配 URL 的正则表达式的包。

结论

我们忽视的诸如此类的小事可能会给安全增加了很大的风险。在这篇文章中,我们了解了可能由有害正则表达式模式引起的 DoS 攻击、主要原因、以及我们应如何缓解它们。有必要缓解这种情况,因为它们会影响网站的可用性,并且可能会花费您很多资金。

原文标题:正则表达式也会导致拒绝服务?探讨 ReDos(可能会中招哦)

文章出处:【微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8111

    浏览量

    82491
  • 拒绝服务
    +关注

    关注

    0

    文章

    3

    浏览量

    7988
  • 正则表达式
    +关注

    关注

    0

    文章

    25

    浏览量

    3432

原文标题:正则表达式也会导致拒绝服务?探讨 ReDos(可能会中招哦)

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是正则表达式正则表达式如何工作?哪些语法规则适用正则表达式

    正则表达式又称规则表达式(Regular Expression,在代码中常简写为 regex、regexp 或 RE),是一种用于匹配、查找、替换文本的强大工具。它能够以特定的模式匹配字符串,从而
    的头像 发表于 11-03 14:41 550次阅读
    什么是<b class='flag-5'>正则表达式</b>?<b class='flag-5'>正则表达式</b>如何工作?哪些语法规则适用<b class='flag-5'>正则表达式</b>?

    shell正则表达式学习

    正则表达式在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多
    发表于 07-25 17:18

    浅析正则表达式

    正则表达式与django
    发表于 08-29 11:09

    正则表达式运用解析

    正则表达式的运用二
    发表于 09-11 08:59

    初识 Python 正则表达式

    正则表达式是一个特殊的字符序列,用于判断一个字符串是否与我们所设定的字符序列是否匹配,也就是说检查一个字符串是否与某种模式匹配。Python 自 1.5 版本起增加了re 模块,它提供 Perl
    发表于 03-17 16:44

    深入浅出boost正则表达式

    什么是正则表达式正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express. 如果您不知道什么是正则表达式,请看这篇文章:深入浅出之正则表达式
    发表于 09-08 18:09 9次下载

    精通正则表达式

    详细的快速正则表达式的查询电子书,简单而丰富
    发表于 05-16 18:04 5次下载

    Python正则表达式的学习指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化
    发表于 09-15 08:00 0次下载
    Python<b class='flag-5'>正则表达式</b>的学习指南

    Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化
    发表于 03-26 09:13 10次下载
    Python<b class='flag-5'>正则表达式</b>指南

    C语言如何使用正则表达式

    C语言的正则表达式规则,特此跟大家分享。
    的头像 发表于 03-16 08:41 4284次阅读

    python正则表达式中的常用函数

    编译正则表达式模式,返回一个正则对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
    的头像 发表于 03-18 16:12 1555次阅读

    Linux入门之正则表达式

    正则表达式是用来表达字符串匹配模式的方法,利用正则表达式,可以让我们轻易地实现对目标字符串的**查找**、**删除**、**替换**等操作。 正则表达式并不复杂,它并不包含难以理
    的头像 发表于 05-12 15:31 564次阅读
    Linux入门之<b class='flag-5'>正则表达式</b>

    shell脚本基础:正则表达式grep

    在Linux上有许多命令可以使用正则表达式,其中最常见的是grep命令和sed命令。正则表达式有多种类型,每种类型中可以使用的元字符类型不同。最常见的是基本正则表达式和扩展正则表达式
    的头像 发表于 05-29 09:29 769次阅读
    shell脚本基础:<b class='flag-5'>正则表达式</b>grep

    Python中的正则表达式

    哈喽大家好,我是了不起,今天给大家讲Python中的正则表达式 在Python中,正则表达式是一种强大的文本处理工具,它可以用来匹配、搜索、替换文本。正则表达式是一个特殊的字符序列,它可以描述一类
    的头像 发表于 06-21 16:52 708次阅读

    linux正则表达式匹配字符串

    在Linux操作系统中,正则表达式是一种强大的模式匹配工具,它可以用于在文本中查找、替换和筛选特定的字符串。准确掌握正则表达式的语法和常见应用,对于Linux系统的管理员和开发人员来说
    的头像 发表于 11-23 10:26 329次阅读