如何通过代码审计挖掘REDos漏洞

 写这篇文章的目的一是由于目前网上关于java代码审计的资料实在是太少了,本人作为一个java代码审计的新手,深知学习java代码审计的难受之处,所以将自己学习过程中挖掘的一些漏洞写成博客发出来希望可以给后人一些帮助,同时也可以记录下自己的成长过程。目的二是由于这次挖掘的漏洞REDOS,个人觉得这个漏洞还是很有意思的,很早就知道这个漏洞了但是从来没有挖到过,终于在一个月前挖到了,很开心,记录一下。

先介绍下REDOS这个漏洞吧,可能很多人并不是很熟悉这个漏洞,一是由于这种漏洞造成的影响是拒绝服务,影响似乎不是很严重;二是这种漏洞一般需要通过白盒测试才能发现,通常的黑盒测试很难发现这种漏洞。

OWASP的对它的描述是:正则表达式拒绝服务(Regular expression Denial of Service-ReDoS)是一种拒绝服务攻击(

 

可以看到javaphppython都是用的NFAJS中好像也是),也就是说这些语言中用了正则的api都是可能存在问题的哦。比如java中比较常见的split,replaceAll等,这些方法中既可以接受字符串也可以接受正则表达式的。

说了这么多,准备进入正题吧,为什么一个月前就发现漏洞了,现在才写博客呢,本来是想等作者修复漏洞后再写博客的,但是因为github上的作者到现在都没有回复我,似乎并不准备修复,而我也懒得等了,直接将漏洞披露出来吧,毕竟漏洞影响不大,并且漏洞和程序上下文的联系也不大,复现的时候只需要将缺陷代码单独拿出来在本地复现即可。

 upload/201810191703280124.png" alt="" style="border: 0px; max-width: 900px; height: auto;" />

 

发现程序运行的很快,关键是成功替换了字符串。回顾之前的说的,之所以能造成REDOS攻击是因为一直匹配失败,引擎才会反复尝试导致攻击的。怎样让他匹配失败呢又一直尝试呢?只需要将后缀.(a+)+改为.(a+)+$。这个正则的意思就是字符串必须以a结尾才行。修改之后重新运行:

 

 

发现虽然运行很快但是不会替换字符串了,也就是说匹配失败。

那我们再将inputFilePath改下,让程序匹配的时间长一些,如下图:

 

 

发现程序一直在运行,说明攻击成功了。

总结一下,挖掘REDOS漏洞,一是需要对程序中用到了正则的api有些了解(replaceAll只是最为常见的,其实还有很多),后面有时间的话我也会对这些api做些整理;二是要对正则有一定的了解才方便构造poc

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信