Apache Tomcat before 5.5.35, 6.x before 6.0.35, and 7.x before 7.0.23 computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters.
下面截图来自洪教授的 PPT,但内容的具体来源不详了(尝试找了下,没找到),大家参考参考就好。实现 hash 冲突 DoS 攻击所须带宽 左边表示用不同的语言(框架)实现这种攻击所需要的带宽,右边是攻击的 cpu 目标。可以看出,实施这种攻击成本其实挺低的(后文石头的试验也佐证了这一点)。不得不说 “PHP 是世界上最好的编程语言”(大家别打架),还是有一定道理的,哈哈哈哈哈哈 😝(一张图还不够,再加一张)上面的语言排序,不一定对,大家参考一下即可,不用纠结具体的准确性。 其实要验证,方法当然也相对简单,只要找出产生冲突的不同字符串即可,具体语言可能不一样。
具体生成过程本文不详述了,感兴趣可以看看 StackOverflow 上的这篇文章 Application vulnerability due to Non Random Hash Functions[3],或者参考耗子叔的这篇 Hash Collision DoS 问题[4]。 然后我启用一个 SpringBoot(2.2.2.RELEASE) 的 Web 服务,JDK 1.8(其实用 1.7 效果更明显)。
More than the maximum number of request parameters (GET plus POST) for a single request ([10,000]) were detected. Any parameters beyond this limit have been ignored. To change this limit, set the maxParameterCount attribute on the Connector.
post参数数量被限制 一种方法当然是去修改这个请求参数个数的限制。另外其实可以尝试用 JDK 1.7 去验证,应该效果会更好(原因,聪明的读者你肯定知道吧?)。这里石头哥就懒得去折腾了,直接尝试以量来取胜,用前文说的 ab 进行并发提交请求,然后观察效果。 这是我用如下参数跑的压测结果:
ab -c 200 -n 100000 -p req.txt 'localhost:8080/hash'
压测的结果如图所示:
ab 压测 hash 冲突结果 然后我们来看看 CPU 的变化情况,特意录屏做了个动图,可以看出还是相对比较明显的。从基本不占用 cpu 到 39.6%,然后突然就涨到 158% 了。hash-collision-demo动图 实际试验中这个过程没有一直持续(上面是重试过程中抓到的其中一次),一方面因为本人用的 JDK 1.8,本来冲突后的查找过程已经优化了,可能效果并不明显,另外也猜测可能会有一些 cache 之类的优化吧,另外对于 10000 的量也还不够?具体我也没有深究了,感兴趣的读者可以去尝试一下玩玩。到这里实验算成功了吧。实验成功就是拽 我这还是单机,要是多搞几个 client,不分分钟把 Web 服务搞死啊。
[1]oCERT-2011-003 multiple implementations denial-of-service via hash algorithm collision: http://ocert.org/advisories/ocert-2011-003.html[2]CVE-2011-4858: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4858[3]Application vulnerability due to Non Random Hash Functions: https://stackoverflow.com/questions/8669946/application-vulnerability-due-to-non-random-hash-functions[4]Hash Collision DoS 问题: https://coolshell.cn/articles/6424.html