最近一个Hash Collision DoS(Hash碰撞的拒绝式服务攻击)漏洞影响颇大,有恶意的人会通过这个安全弱点会让你的服务器运行巨慢无比,本文试图对这一漏洞的原理及可采取措施做一解析,供大家参考。
一言蔽之,该安全弱点利用了各语言的Hash算法的“非随机性”可以制造出N多的value不一样,但是key一样数据,然后让你的Hash表成为一张单向链表,而导致你的整个网站或是程序的运行性能以级数下降(可以很轻松地让你的CPU升到100%)。
目前,这个问题出现于Java、JRuby、PHP、Python、Rubinius、Ruby这些语言中,主要有:
注意,Perl没有这个问题,因为Perl在N年前就fix了这个问题了。关于这个列表的更新,请参看oCERT的2011-003报告。这个问题早在2003 年就在论文《通过算法复杂性进行拒绝式服务攻击》中被报告了,但是好像没有引起注意,尤其是Java。 弱点攻击解释 你可能会觉得这个问题没有什么大不了的,因为黑客看不到hash算法,如果你这么认为,那么你就错了,这说明对Web编程的了解还不足够底层。 无论你用JSP、PHP、Python、Ruby来写后台网页的时候,在处理HTTP POST数据的时候,你的后台程序可以很容易地以访问表单字段名来访问表单值,就像下面这段程序一样:
- $usrname = $_POST['username'];
- $passwd = $_POST['password'];
这是怎么实现的呢?这后面的东西就是Hash Map啊,所以,我可以给你后台提交一个有10K字段的表单,这些字段名都被我精心地设计过,他们全是Hash Collision ,于是你的Web Server或语言处理这个表单的时候,就会建造这个hash map,于是在每插入一个表单字段的时候,都会先遍历一遍你所有已插入的字段,于是你的服务器的CPU一下就100%了,你会觉得这10K没什么,那么我就发很多个的请求,你的服务器一下就不行了。 举个例子,你可能更容易理解: 如果你有n个值—— v1, v2, v3, … vn,把他们放到hash表中应该是足够散列的,这样性能才高: 引用
0 -> v2
1 -> v4
2 -> v1
…
…
n -> v(x)
但是,这个攻击可以让我造出N个值—— dos1, dos2, …., dosn,他们的hash key都是一样的(也就是Hash Collision),导致你的hash表成了下面这个样子: 引用
0 – > dos1 -> dos2 -> dos3 -> …. ->dosn
1 -> null
2 -> null
…
…
n -> null
于是,单向链接就这样出现了。这样一来,O(1)的搜索算法复杂度就成了O(n),而插入N个数据的算法复杂度就成了O(n^2),你想想这是什么样的性能。 (关于Hash表的实现,如果你忘了,那就把大学时的《数据结构》一书拿出来看看) Hash Collision DoS 详解 StackOverflow.com是个好网站,合格的程序员都应该知道这个网站。上去一查,就看到了这个贴子“Application vulnerability due to Non Random Hash Functions”。这里把这个贴子里的东西摘一些过来。 首先,这些语言使用的Hash算法都是“非随机的”,如下所示,这个是Java和Oracle使用的Hash函数:
- static int hash(int h)
- {
- h ^= (h >>> 20) ^ (h >>> 12);
- return h ^ (h >>> 7) ^ (h >>> 4);
- }
所谓“非随机的” Hash算法,就可以猜。比如: 1)在Java里,Aa和BB这两个字符串的hash code(或hash key)是一样的,也就是Collision 。 2)于是,我们就可以通过这两个种子生成更多的拥有同一个hash key的字符串。如:”AaAa”, “AaBB”, “BBAa”, “BBBB”。这是第一次迭代。其实就是一个排列组合,写个程序就搞定了。 3)然后,我们可以用这4个长度的字符串,构造8个长度的字符串,如下所示: 引用
"AaAaAaAa", "AaAaBBBB", "AaAaAaBB", "AaAaBBAa",
"BBBBAaAa", "BBBBBBBB", "BBBBAaBB", "BBBBBBAa",
"AaBBAaAa", "AaBBBBBB", "AaBBAaBB", "AaBBBBAa",
"BBAaAaAa", "BBAaBBBB", "BBAaAaBB", "BBAaBBAa",
4)同理,我们就可以生成16个长度的,以及256个长度的字符串,总之,很容易生成N多的这样的值。 在攻击时,我只需要把这些数据做成一个HTTP POST 表单,然后写一个无限循环的程序,不停地提交这个表单。你用你的浏览器就可以了。当然,如果做得更精妙一点的话,把你的这个表单做成一个跨站脚本,然后找一些网站的跨站漏洞,放上去,于是能过SNS的力量就可以找到N多个用户来帮你从不同的IP来攻击某服务器。 防御措施 要防守这样的攻击,可以尝试下面几招:
- 打补丁,把hash算法改了。
- 限制POST的参数个数,限制POST的请求长度。
- 最好还有防火墙检测异常的请求。
分享到:
相关推荐
标题中的“Hash Collision DoS漏洞:web实例”指的是在Web应用程序中出现的一种安全问题,即哈希碰撞拒绝服务攻击(Hash Collision Denial of Service)。这种攻击利用了哈希表(Hash Table)数据结构的特性,当两个...
Java实现的Hash Collision DoS Attack
最后,文章指出,针对Hash Collision Dos的扰动因素可能比加密策略本身更为有效,因为即使攻击者能触发碰撞,但如果无法登录,他们可能会放弃攻击。总的来说,防范此类攻击需要综合考虑算法选择、数据处理策略、硬件...
这种算法的优点是计算速度快,但是它的缺点是容易产生碰撞(collision),即不同的输入字符串可能产生相同的 Hash 值。 在 Java 中,实现加法 Hash 算法的代码如下: ```java public static int additiveHash...
莫尔斯电码哈希碰撞检测器这是什么? 这个小工具将相当于字母表中每个字母的二进制莫尔斯电码转换为一个数字。 这个数字可以用作表的索引。你为什么需要这个? 如果您正在尝试莫尔斯电码挑战,此工具会计算将二进制...
理想情况下,哈希函数应该能够均匀分布数据,从而减少碰撞(hash collision)的概率。碰撞指的是两个不同的键被哈希到同一个位置的情况。 - **解决冲突**:即使是最优的哈希函数也无法完全避免碰撞的发生。常见的...
本文档收集了前端大厂最新面试题的 Hash Table 相关知识点,涵盖 Hash Table 的基本概念、 ハッシュ関数、 Collision 解决方法、Hash Table 的实现和应用等方面。 一、Hash Table 基本概念 * Hash Table 是一种...
Hash 函数的特点是确定性、不可逆性和 collision-resistance, Hash 函数的应用非常广泛,例如数字签名、身份验证和数据完整性检查等。 在 Cryptography Theory and Practice(Stinson)一书中,作者对 Hash 函数...
抗碰撞性(Collision-resistant) 抗碰撞性是另一个重要的安全特性,它分为两种类型: - **弱抗碰撞性**:对于任意给定的数据块X,很难找到另一个数据块Y(X ≠ Y),使得H(X) = H(Y)。这可以防止恶意用户通过...
- **SHA1简介**:SHA1(Secure Hash Algorithm 1)是一种常见的安全散列算法,由美国国家安全局设计,美国国家标准与技术研究院发布。它能将任意长度的消息转换成一个160位(20字节)的散列值,广泛应用于数字签名、...
哈希冲突(Hash Collision)是使用哈希函数时不可避免的问题,即不同的输入可能会得到相同的哈希值。处理哈希冲突的方法主要有两种:开放寻址法和链地址法。开放寻址法是指当发生冲突时,寻找下一个空的哈希地址,...
2. **冲突解决(Collision Resolution)**:如果两个或更多的键哈希到了同一个位置,就需要一种方法来处理冲突。常见的策略如线性探测再散列、二次探测再散列或使用链表。Delphi实现可能选择其中一种,也可能设计了...
1. **哈希碰撞(Hash Collision)**:由于哈希函数的输出空间有限,不同的输入可能会得到相同的哈希值,这种情况称为哈希碰撞。优秀的哈希函数应尽量减少哈希碰撞,以提高查找效率。 2. **优化哈希码**:在自定义类...
2. **抗冲突性(Collision-resistant)**: - 弱抗冲突性:对于给定的消息\( M \),在计算上难以找到另一个消息\( M' \),使得\( H(M) = H(M') \)。 - 强抗冲突性:在计算上难以找到任何两个不同的消息\( M \)和\...
一个理想的杂凑函数应该能确保对于任意的输入消息,都几乎不可能找到两个不同的消息产生相同的杂凑值,即所谓的碰撞(collision)。同时,即使知道了杂凑函数的输出,也很难逆向找到原始的输入消息,即抗预象攻击...
/ #include #define COLLISIONFACTOR 0.5 ...int hash(int keyoffset,int keylen,void *buf,int recnum); int checkHashFileFull(int fd); int readHashFileHeader(int fd,struct HashFileHeader *hfh );
比如,如果对安全性要求较高,可能需要选择一个抗碰撞性(Collision Resistance)更强的算法,如SHA-256。 最后,虽然PHP提供了如此丰富的hash函数,但这些函数的正确使用和安全实践同样重要。例如,在存储用户密码...
PHP哈希冲突查找器这是一个用 C++ 编写的工具,它演示了哈希冲突(目前只有 md5)模 PHP 等价(== 比较运算符)。 即搜索字符串$s,如: strlen($s) == $n && md5($prefix . $s . $suffix) == '0' 这个特性可以在...
哈希(Hash)是一种算法,用于将任意长度的数据映射为固定长度的值。这些值通常称为哈希值或摘要。哈希算法的一个重要特性是,对于任何给定的输入,其输出始终相同,且即使是微小的变化也会导致完全不同的哈希值。...