青年没想到 Hash 冲突还能这么玩,你的服务中招了吗?( 二 )


这里 , 咱们给列举其中一个 Apatch Tomcat , 来自 CVE-2011-4858[2] 。
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 冲突还能这么玩,你的服务中招了吗?
本文插图
实现 hash 冲突 DoS 攻击所须带宽
左边表示用不同的语言(框架)实现这种攻击所需要的带宽 , 右边是攻击的 cpu 目标 。 可以看出 , 实施这种攻击成本其实挺低的(后文石头的试验也佐证了这一点) 。
青年没想到 Hash 冲突还能这么玩,你的服务中招了吗?
本文插图
不得不说 “PHP 是世界上最好的编程语言”(大家别打架) , 还是有一定道理的 , 哈哈哈哈哈哈 ????(一张图还不够 , 再加一张)
青年没想到 Hash 冲突还能这么玩,你的服务中招了吗?
本文插图
上面的语言排序 , 不一定对 , 大家参考一下即可 , 不用纠结具体的准确性 。
其实要验证 , 方法当然也相对简单 , 只要找出产生冲突的不同字符串即可 , 具体语言可能不一样 。
talk is cheap 现在跟着我来尝试进行一次攻击吧 , 本人用自己的笔记本进行试验(配置:MBP 13-inch , 2.5 GHz Intel Core i7 , 16 GB 2133 MHz LPDDR3) 。
首先构造一把 hash 冲突的字符串 , 下面代码是 hash 冲突的字符串对的实例 , 后面的其实可以通过前面排列组合生成 。
System.out.println("Aa".hashCode)System.out.println("BB".hashCode)System.out.println("BBBBBBBBBBBBBBBBBBBBBBBBAaBBBBAa".hashCode)System.out.println("BBBBBBBBBBBBBBBBBBBBBBBBAaBBBBBB".hashCode)// 输出2112211220678584322067858432
具体生成过程本文不详述了 , 感兴趣可以看看 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 效果更明显) 。
@RequestMapping("/hash")public String hash(HttpServletRequest request) { // Demo , 简单返回参数大小和其对应hashCode int size = request.getParameterMap.size String key = (String)(request.getParameterMap.keySet.toArray)[0] return String.format("size=%s, hashCode=%s", size, key.hashCode)}
先试水一把(如下图) , 看看基本功能正常 , 用 curl 发送请求即可 , 然后将 post 的字段放在文件里面(太长也只能放文件中) 。
青年没想到 Hash 冲突还能这么玩,你的服务中招了吗?
本文插图
curl 实验结果
生成的字符串不够的话 , 还可以增加并发请求 , 可以借用类似 “Apache Benchmarking” 压测的工具发送请求 , 我之前也有一篇文章介绍了这个命令 性能测试工具 - ab 简单应用 , 感兴趣的可以参考一下 。


推荐阅读