`

Hash Collision DoS

阅读更多

        最近,除了国内明文密码的安全事件,还有就是 Hash Collision DoS (Hash碰撞的拒绝式服务攻击),有恶意的人会通过这个安全弱点会让你的服务器运行巨慢无比。这个安全弱点利用了各语言的Hash算法的“非随机性”可以制造出N多的value不一样,但是key一样数据,然后让你的Hash表成为一张单向链表,而导致你的整个网站或是程序的运行性能以级数下降(可以很轻松的让你的CPU升到100%)。目前,这个问题出现于JavaJRubyPHPPythonRubiniusRuby这些语言中,主要:

       ▲ Java, 所有版本

       ▲ JRuby <= 1.6.5 (目前fix在 1.6.5.1)

       ▲ PHP <= 5.3.8, <= 5.4.0RC3 (目前fix在 5.3.9,  5.4.0RC4)

       ▲ Python, all versions

       ▲ Rubinius, all versions

       ▲ Ruby <= 1.8.7-p356 (目前fix在 1.8.7-p357, 1.9.x)

       ▲ Apache Geronimo, 所有版本

       ▲ Apache Tomcat <= 5.5.34, <= 6.0.34, <= 7.0.22 (目前fix在 5.5.35,  6.0.35,  7.0.23)

       ▲ Oracle Glassfish <= 3.1.1 (目前fix在mainline)

       ▲ Jetty, 所有版本

       ▲ Plone, 所有版本

       ▲ Rack <= 1.3.5, <= 1.2.4, <= 1.1.2 (目前fix 在 1.4.0, 1.3.6, 1.2.5, 1.1.3)

       ▲ V8 JavaScript Engine, 所有版本

       ▲ ASP.NET 没有打MS11-100补丁

       注意,Perl没有这个问题,因为Perl在N年前就fix了这个问题了。关于这个列表的更新,请参看 oCERT的2011-003报告,比较坑爹的是,这个问题早在2003 年就在论文《通过算法复杂性进行拒绝式服务攻击》中被报告了,但是好像没有引起注意,尤其是Java。

       弱点攻击解释

       你可以会觉得这个问题没有什么大不了的,因为黑客是看不到hash算法的,如果你这么认为,那么你就错了,这说明对Web编程的了解还不足够底层。

       无论你用JSP,PHP,Python,Ruby来写后台网页的时候,在处理HTTP POST数据的时候,你的后台程序可以很容易地以访问表单字段名来访问表单值,就像下面这段程序一样:

        1
        2
$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的请求长度。

        ▲ 最好还有防火墙检测异常的请求。

        不过,对于更底层的或是其它形式的攻击,可能就有点麻烦了。

分享到:
评论

相关推荐

    Java Hash Collision DoS Attack

    Java实现的Hash Collision DoS Attack

    关于Hash Collision DoS漏洞:web实例

    标题中的“Hash Collision DoS漏洞:web实例”指的是在Web应用程序中出现的一种安全问题,即哈希碰撞拒绝服务攻击(Hash Collision Denial of Service)。这种攻击利用了哈希表(Hash Table)数据结构的特性,当两个...

    警惕Hash Collision Dos.pdf

    【警惕Hash Collision Dos】这篇文档主要讨论了一种名为“Hash Collision Dos”的网络安全威胁,这种攻击方式利用了哈希表(HashTable)的冲突特性对Web服务器进行拒绝服务(Denial of Service,DoS)攻击。...

    hashcollision

    莫尔斯电码哈希碰撞检测器这是什么? 这个小工具将相当于字母表中每个字母的二进制莫尔斯电码转换为一个数字。 这个数字可以用作表的索引。你为什么需要这个? 如果您正在尝试莫尔斯电码挑战,此工具会计算将二进制...

    aHash 是一种使用 AES 硬件指令的非加密哈希算法_rust_代码_下载

    AHash 是目前 Rust中最快的、 抗 DOS 的哈希。AHash专门用于内存中的哈希映射。 AHash 的输出质量很高 因为AHash是keyed hash,每个map会产生完全不同的hash,不知道key是无法预测的。 这可以防止 DOS 攻击,其中...

    HASHIN.rar_ABAQUS_Hashin失效准则 abaqus_abaqus hashin_abaqus 三维Hashi

    标题中的"HASHIN.rar_ABAQUS_Hashin失效准则 abaqus_abaqus hashin_abaqus 三维Hashi"表明这是一个关于ABAQUS软件中应用Hashin失效准则进行三维分析的示例或教程。ABAQUS是一款广泛应用的有限元分析软件,尤其在结构...

    3d.zip_3维hashin准则_Hashin 3D_hashin_失效准则_层合板 hashin

    在复合材料领域,Hashin失效准则是一个非常重要的理论模型,尤其在分析三维层合板的强度和稳定性时。Hashin准则由Stanley Hashin在20世纪60年代提出,用于预测多向复合材料的破坏行为。这个准则考虑了内部微裂纹的...

    hashin-strain-3d_hashin_三维hashin_三维hashin失效_失效准则_3D—Hashin_

    **三维Hashin失效准则详解** 在复合材料领域,失效分析是至关重要的,它关系到材料的性能预测和结构安全。Hashin失效准则是一种广泛应用的多向复合材料失效理论,由Shlomo Hashin于1962年提出,主要用于评估多向受...

    uthash开源的hash函数实现

    UTHASH 是一个开源的 C 语言库,提供了一种简单且高效的哈希表实现,用于在 C 代码中快速查找和管理数据结构。这个库的主要功能是提供一个宏定义的集合,可以方便地将结构体转化为哈希表,进而进行添加、删除、查找...

    UMAT_Hashin3D_hashin

    标题 "UMAT_Hashin3D_hashin" 指涉的是一个专门针对复合材料损伤分析的三维子程序,该程序基于Hashin破坏准则。在有限元分析(FEA)中,用户自定义材料(User-Defined Material,UMAT)是实现特定材料行为建模的一种...

    Hash值查看以及修改软件(Hash_1.0.4_0523.exe以及HashModifier.exe)

    在IT领域,Hash值是一种广泛使用的数据校验方式,它能够为任何大小的文件生成一个固定长度的唯一标识,这个标识通常称为哈希值或散列值。Hash值查看及修改软件,如"Hash_1.0.4_0523.exe"和"HashModifier.exe",是...

    前端大厂最新面试题-hash-table.docx

    本文档收集了前端大厂最新面试题的 Hash Table 相关知识点,涵盖 Hash Table 的基本概念、 ハッシュ関数、 Collision 解决方法、Hash Table 的实现和应用等方面。 一、Hash Table 基本概念 * Hash Table 是一种...

    高运算性能,低碰撞率的hash算法MurmurHash算法.zip

    MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...

    hashin失效vumat_hashin破坏准则_vumatfailure_vumathashin失效_hashin_vumat

    在IT行业中,尤其是在模拟仿真和材料科学领域,Hashin失效准则是一种广泛应用的理论,用于预测多相复合材料的破坏行为。VUMAT(User-Defined Viscoplasticity and Damage Material Subroutine)是ABAQUS软件中的一个...

    hashin失效vumat,hashin失效准则介绍,Fortran

    在IT行业中,尤其是在科学计算和工程模拟领域,Hashin失效准则和VUMAT(User-Defined Material subroutine for Nonlinear Analysis in ABAQUS)是两个非常重要的概念。这两个概念主要应用于复合材料、土木工程等领域...

    hashcat-6.2.6(hash爆破工具)

    内容描述:用于crypto中hash爆破的强大工具。 优势:相较于其他hash工具,具有更快的算力,使用方便简洁。 适用:适用于md5,sha256等典型hash加密方式,反推出所需的源码。

    HASH_hash_stm32hash_stm32hash表_stm32f407_

    在STM32F407上实现的哈希(Hash)算法是数字签名、数据完整性验证等安全应用中的关键组成部分。哈希算法能够将任意长度的输入数据转化为固定长度的输出,通常称为哈希值或消息摘要。 哈希算法的主要特性包括: 1. *...

    GEOHASH Javascript的实现

    2. `geohash-demo.js`:包含`GEOHASH`的JavaScript实现代码,可能包括编码、解码以及相邻`GEOHASH`的计算功能。 3. `labeledmarker.js`:可能是一个辅助库,用于在地图上绘制带有标签的标记,用于展示`GEOHASH`对应...

    C开源hash代码uthash

    uthash 是C的比较优秀的开源代码,它实现了常见的hash操作函数,例如查找、插入、删除等待。该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构最为key值,甚至可以采用多个值作为key,无论...

    各种Hash函数(JAVA版)

    RS-Hash Function Value: " + ghl.RSHash(key)); System.out.println(" 2. JS-Hash Function Value: " + ghl.JSHash(key)); System.out.println(" 3. PJW-Hash Function Value: " + ghl.PJWHash(key)); System....

Global site tag (gtag.js) - Google Analytics