了解攻击媒介
哈希映射的工作原理
假设博客上的评论表单接受参数 ( first_name、last_name、评论 ) 作为帖子参数。在内部,Tomcat将这些参数存储为HashMap。
这个HashMap的逻辑结构是这样的 -
"first_name" --> "Sripathi"
"last_name" --> "Krishnan"
"comment" ---> "DoS using poor Hashes"
但物理结构是不同的。首先将密钥转换为哈希码,然后将哈希码转换为数组索引。
因此,理想的物理结构就变成了——
0 --> "Sripathi"
1 --> "Krishnan"
2 --> "DoS using poor Hashes"
但可能的键是无限的。因此,在某些时候,两个密钥将具有相同的哈希代码。这将成为哈希冲突。
随着碰撞,物理结构变为:
0 --> "Sripathi", "Krishnan"
1 --> Empty
2 --> "DoS using poor hashes"
哈希冲突及其对性能的影响
当您遇到哈希冲突时,插入新条目意味着按顺序迭代单个哈希“存储桶”中的所有元素,只是为了确定它是否已经存在于映射中。如果所有元素都散列到相同的值,则插入一个元素可以接近O(n)复杂性。在这种最坏的情况下插入n个元素会使它变得O(n*n)复杂。
简而言之:如果您插入数千个具有相同哈希码的密钥,则服务器将需要大量的CPU周期。
如何使用相同的哈希生成密钥?
在Java中,“Aa”和“BB”具有相同的哈希代码。
由于一个名为“等效子字符串”的属性,我们可以使用相同的哈希码生成其他几个字符串,只需从这2个字符串开始即可。
第一次迭代:“AAAA”,“AABb”,“BbAA”,“BbBb”具有相同的哈希代码
现在,我们有4个具有相同哈希代码的字符串。我们可以将它们置换以生成16个具有相同哈希代码的字符串。例如:
"AaAaAaAa", "AaAaBBBB", "AaAaAaBB", "AaAaBBAa",
"BBBBAaAa", "BBBBBBBB", "BBBBAaBB", "BBBBBBAa",
"AaBBAaAa", "AaBBBBBB", "AaBBAaBB", "AaBBBBAa",
"BBAaAaAa", "BBAaBBBB", "BBAaAaBB", "BBAaBBAa",
所有这些 16 个字符串都具有相同的哈希代码。
现在,您可以获取这 16 个字符串,并生成 256 个具有相同哈希码的字符串。
简而言之:很容易生成一大组字符串,这些字符串将具有确切的哈希代码。
如何攻击服务器?
- 创建数千个具有相同哈希代码的字符串(见上文)
- 像这样构造一个 POST 请求 - AaAa=&AaBB=&BBAa=&BBBB= ....
- 提交表格
- 在循环中重复,并创建多个线程,以便所有服务器资源都用完
由于这只是一个 POST 请求,因此攻击者还可以使用无辜的浏览器来攻击服务器。只需找到一个具有跨站点脚本编写漏洞的网站,嵌入代码以发出POST请求,然后使用社交工程将链接传播给尽可能多的用户即可。
预防
通常,底层平台无法解决此问题。这被认为是一个应用程序框架问题。换句话说,Tomcat必须解决这个问题,而不是Oracle/Sun。
可能的修复包括:
限制 POST 参数的数量 - Tomcat 6.0.35+ 有一个新参数 maxParameterCount。默认值为 10,000。越低越好,只要它不会破坏你的功能。
限制 POST 请求的大小 - 要使攻击起作用,有效负载必须很大。Tomcat 允许的默认开机自检为 2MB。将此减少到200KB将降低此攻击的有效性。tomcat 中的参数是 maxPostSize
Web 应用程序防火墙 - 如果您有 Web 应用程序防火墙,则可以将其配置为阻止看起来可疑的请求。这是一个反应性措施,但如果您无法使用上述解决方案之一,那就太好了。
仅供参考 - 雄猫的文档在这里 - http://tomcat.apache.org/tomcat-6.0-doc/config/http.html