`
ncs123
  • 浏览: 102032 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

正则表达式漏洞引起的问题分析

阅读更多
问题
     一天晚上突然收到同事反馈,其使用的一个正责表达式对收货人姓名处理时,输入某种字符不能正确保存,现象为服务端请求卡死,没有response返回给客户端;在测试环境重现该问题时通过jstack获取到的信息可以发现正则表达式在回溯处理,进一步通过RegexBuddy对该段正则表达式分析发现该该段正则表达式处理完成需要超过一百万次匹配如果有恶意用户发现该漏洞,对考拉发起ReDoS(Regular expression Denial of Service)攻击,可能会引发灾难性的后果。



根源
    从本质上讲,存在两种不同类型的正则表达式引擎:确定性有穷自动机 (DFA) 引擎和非确定性有穷自动机 (NFA) 引擎。
    DFA 对于文本串里的每一个字符只需扫描一次,比较快,但特性较少;
    NFA要翻来覆去吃字符、吐字符,速度慢,但是特性丰富,所以反而应用广泛,当今主要的正则表达式引擎.Java同样采用NFA。
^\d+$

    如果整个输入字符串仅包含数字字符,则这是一个相当简单的匹配正则表达式。^ 和 $ 字符分别表示字符串的开头和结尾,表达式 \d 表示数字字符,+ 指示将有一个或多个字符匹配。我们使用 123456X 作为输入字符串测试此表达式,那么最终又是什么情况呢?同样通过RegexBuddy分析一下,可以发现NFA总共计算出了6个路径:123456、12345、1234、123、12 和 1;经过了20步处理才发现是不符合要求的。下面通过介绍正则表达式的匹配模式去分析一下该如何处理。



正则表达式匹配模式
  • 贪婪型
  • 勉强型
  • 占有型


贪婪型:
    X?、X*、X+、X{n,}都是最大匹配,上面的例子就是一个贪婪型。

勉强型:
    X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都最小匹配。上面的例子如果改为勉强型是不是可以解决问题呢?通过实验发现是解决不了问题的。从上下两幅图中还是可以发现两者的区别的。一个从最大处开始回溯,一个在最小处回溯。


占有型:
    与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢;发现解决问题的曙光了。

    问题解决了,那么回过头来,再看开始的问题,如果将其改造为占有型不是就可以解决问题了

固化分组
    用(?>…)实现固化分组(成功匹配后,回溯时不会考虑这个匹配的字符)。也就是说,在固化分组匹配结束时,它已经匹配的文本已经固化为一个单元,只能作为整体而保留或放弃。括号内的子表达式中未尝试过的备用状态都不复存在了,所以回溯永远也不能选择其中的状态(至少是,当此结构匹配完成时,“锁定(locked in)”在其中的状态)。

    最终选择方案:^(?>[\u4e00-\u9fa5|A-Z]+\\s*\\.?\\s*)+[\u4e00-\u9fa5|A-Z]$
 

   
  • 大小: 229.6 KB
  • 大小: 66.9 KB
  • 大小: 37.3 KB
  • 大小: 61.3 KB
  • 大小: 55.7 KB
分享到:
评论

相关推荐

    网站爬虫开发以及SQL注入检测插件.pdf

    网站爬虫开发与SQL注入检测是两个紧密相关的网络安全领域中的技术。...通过实践,学习者能够掌握如何开发网站爬虫、如何编写SQL注入检测工具,并学会使用正则表达式来分析和利用Web应用中的安全漏洞。

    PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案

    **漏洞成因分析** 当调用tidy_parse_file函数时,它接受三个参数:一个URL或文件名,一个字符串缓冲区,以及两个布尔值。问题在于对文件路径参数的处理不当。由于没有对路径长度进行限制,攻击者可以传递一个超长的...

    cve-2018-8174_analysis:VBS漏洞CVE-2018-8174的分析

    首先,为了消除整数混淆,我在python脚本中使用了正则表达式替换: import re def process ( matchobj ): line = matchobj . group ( 1 ) line = line . lower (). replace ( '&h' , '0x' ) return str ( eval ...

    三步堵死SQL注入漏洞

    例如,可以使用正则表达式来验证电子邮件地址或电话号码的格式,同时使用函数如`htmlspecialchars()`(HTML实体编码)或`mysql_real_escape_string()`(针对MySQL的特殊字符转义)来处理输入,确保它们不会被解释为...

    高级PHP应用程序漏洞审核技术

    虽然自动化工具能够提高效率,但它们通常依赖于正则表达式匹配,这可能会忽略某些特定场景下的复杂漏洞。 #### 三、PHP版本与应用代码审计 不同版本的PHP可能具有不同的安全特性,因此了解所审计应用的PHP版本至关...

    ChatGPT 网络安全#1.pdf

    例如,配置sysmon与Snort可以增强系统的监控能力,使用正则表达式在Splunk中过滤IP和URL,以提高日志分析效率。同时,编写.bat脚本可以帮助进行初步的法医调查。 红队行动是一种模拟对手攻击的过程,用以评估组织的...

    ECSHOP全版本注入0day

    1. **输入验证**:加强对用户输入的数据进行验证,例如使用正则表达式过滤掉潜在的SQL注入攻击字符串。 2. **参数化查询**:采用参数化查询技术,避免直接将用户输入的数据拼接到SQL语句中。 3. **最小权限原则**:...

    BUUCTF部分web题目

    1. **正则表达式过滤**: 在题目中,作者使用了`preg_match()`函数来过滤用户输入,防止常见的命令注入攻击。 - **语法**: `preg_match(pattern, subject, matches, flags, offset)` - **作用**: 检查字符串是否匹配...

    sqlinject-sql注入资料

    - 使用正则表达式过滤掉可能引起SQL注入的字符。 - 对用户输入进行严格的类型检查。 **参数化查询** - 使用预编译语句或参数化查询,确保输入值不会被解释为SQL命令的一部分。 **限制数据库权限** - 应用程序...

    android secure coding

    可以通过设置正则表达式等方式来限定输入格式,从而避免SQL注入、XSS攻击等安全问题。 - **过滤敏感字符**:过滤掉可能引起安全风险的特殊字符,如引号、分号等,防止注入攻击。 - **参数化查询**:使用参数化查询...

Global site tag (gtag.js) - Google Analytics