加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式攻击实例 Regular Expressions Denial of Service

发布时间:2020-12-14 01:00:57 所属栏目:百科 来源:网络整理
导读:实施正则表达式评估程序及相关方法时存在漏洞,该漏洞会导致评估线程在处理嵌套和重复的正则表达式组的重复和交替重叠时挂起。这个缺陷可被攻击者用于执行 DOS (Denial of Service) 攻击。 仔细研究了一把,完全搞懂这种攻击是怎么回事了。 直接上代码,看的

实施正则表达式评估程序及相关方法时存在漏洞,该漏洞会导致评估线程在处理嵌套和重复的正则表达式组的重复和交替重叠时挂起。这个缺陷可被攻击者用于执行 DOS (Denial of Service) 攻击。

仔细研究了一把,完全搞懂这种攻击是怎么回事了。直接上代码,看的很清楚

public class RegularExpressionsDOSExp
{
	 public static void main(String[] args)
	 {
	 String patterStr = "^(([a-z])+.)+[A-Z]([a-z])+$";
	 String paraStr = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	
	 long startTime = System.currentTimeMillis();
	 final Pattern pattern = Pattern.compile(patterStr);
	 final Matcher matcher = pattern.matcher(paraStr);
	
	 matcher.find();
	
	 System.out.println(paraStr.length());
	 System.out.println("This takes " + (System.currentTimeMillis() -
	 startTime));
	 }
}

实测数据如下:

35个a,耗时950毫秒

40个a,耗时11242毫秒

貌似也没什么好的解决办法,只能通过入参和正则表达式的校验处理防御这种攻击。

另外想到一个方法就是起一个线程来跑正则,如果超时(比如2秒),就认为是受到攻击不是正常逻辑代码,然后终止线程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读