2009 年在以色列召开的开放式 Web 应用程序安全项目(OWASP)会议中,Checkmarx 公 司的总设计师 Alex Roichman 和高级程序员 Adar Weidman共同提交了正则表达式 DoS 攻击 ( ReDoS)课题的研究报告,此报告中针对定义不好的正则表达式给出了可能的漏洞利用手 <?php if (strstr(str_replace('.','',serialize($_REQUEST)),'22250738585072011')){ // request is malicious, abort processing … } 针对攻击字符串“22250738585072011”的各种变种,上面的代码会检查每个输入的请 求,因为该值存在无限个排列值,例如22.50738585072011e-309、225.0738585072011e-310 等。虽然这种“黑名单”输入验证机制通常令人难以接受,但是这种情况下,事实却是:攻 击字符串确实是一个有效浮点数并且很难在正则表达式白名单中进行匹配;而且不能将输入 字符串转换为浮点数以进行测试。 2009 年在以色列召开的开放式 Web 应用程序安全项目(OWASP)会议中,Checkmarx 公 司的总设计师 Alex Roichman 和高级程序员 Adar Weidman共同提交了正则表达式 DoS 攻击 ( ReDoS)课题的研究报告,此报告中针对定义不好的正则表达式给出了可能的漏洞利用手 法,结果表明相对较短的字符串攻击(少于50 个字符)也要花费数小时。在最坏的情况下, 正则表达式验证需要指数级时间,故实际上给测试字符串增加一个字符,处理时间就会成倍 增加。例如,考虑正则表达式模式: ^(d+)+$ 那么由于回溯和分组逻辑的原因,如果我们评估测试字符串123456X,同时为了得出测 试字符串不匹配的结论,引擎必须评估32条不同的路径。如果给测试字符串添加一个字符, 即 1234567X,那么引擎就必须测试64 条路径,比之前多两倍。鉴于处理时间呈指数式增长, 攻击者可以提供一个相对短的测试字符串(如 30 个字符),即使这样也要在服务器端花费 数十年的处理时间。 目前,已知有几个正则表达式模式很容易受到此类攻击的威胁。任何包含重复分组表达式 的正则表达式都很容易受到攻击。例如: 针对攻击字符串“22250738585072011”的各种变种,上面的代码会检查每个输入的请 求,因为该值存在无限个排列值,例如22.50738585072011e-309、225.0738585072011e-310 等。虽然这种“黑名单”输入验证机制通常令人难以接受,但是这种情况下,事实却是:攻 击字符串确实是一个有效浮点数并且很难在正则表达式白名单中进行匹配;而且不能将输入 字符串转换为浮点数以进行测试。 2009 年在以色列召开的开放式 Web 应用程序安全项目(OWASP)会议中,Checkmarx 公 司的总设计师 Alex Roichman 和高级程序员 Adar Weidman共同提交了正则表达式 DoS 攻击 ( ReDoS)课题的研究报告,此报告中针对定义不好的正则表达式给出了可能的漏洞利用手 法,结果表明相对较短的字符串攻击(少于50 个字符)也要花费数小时。在最坏的情况下, 正则表达式验证需要指数级时间,故实际上给测试字符串增加一个字符,处理时间就会成倍 增加。例如,考虑正则表达式模式: ^(d+)+$ 那么由于回溯和分组逻辑的原因,如果我们评估测试字符串123456X,同时为了得出测 试字符串不匹配的结论,引擎必须评估32条不同的路径。如果给测试字符串添加一个字符, 即 1234567X,那么引擎就必须测试64 条路径,比之前多两倍。鉴于处理时间呈指数式增长, 攻击者可以提供一个相对短的测试字符串(如 30 个字符),即使这样也要在服务器端花费 数十年的处理时间。 目前,已知有几个正则表达式模式很容易受到此类攻击的威胁。任何包含重复分组表达式 的正则表达式都很容易受到攻击。例如: ^(d+)*$ ^(d*)*$ ^(d+|s+)*$ 另外,任何位于交替子表达式与另一表达式位置重叠并包含交替值的分组也很脆弱。 ^(d|dd)+$ ^(d|d?)+$ 如果在代码中发现与前面示例代码中相似的表达式,那么只要通过观察,就能认定该表 达式存在漏洞。但有可能会错过表达式中另一个更长、更复杂的漏洞: ^([0-9a-zA-Z]([-.w]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-w]*[0-9a-zA-Z])*.)+[a-zA- Z]{2,9})$ |