首页 > 编程知识 正文

hash函数碰撞问题,相等子串hash碰撞

时间:2023-05-03 06:34:11 阅读:9436 作者:2131

这是迄今为止我第一次害怕的攻击方式,涉及范围广,防御困难,攻击效果明显。 很多网站和Web界面都没有防御Hash冲突攻击,而是有一个个的标准。

随着rest风格的接口越来越流行,程序员默认使用json作为数据传输方法。 json格式的数据冗馀少、兼容性高,从提交到现在都被广泛使用,可以说是Web的一个标准。 无论服务端使用何种语言,在获取json格式的数据后,都必须创建将json列转换为json对象的jsonDecode ) )。 默认情况下,对象存储在Hash Table中,但Hash Table容易受到碰撞攻击。 如果我把攻击数据放在json中,服务端的程序在做jsonDecode (() ) ) )的时候一定会中,中了之后CPU马上就会上升到100%。 16核CPU,16个请求即可实现DoS的目的。

所有测试程序都在Mac Pro下运行,为了方便测试,我只构建了65536个json密钥和值对,在实际发起攻击时可以构建数十万到百万的数据。

几个简单的Demo

攻击数据转换为json格式

一. JavaScript测试

//只用一行代码就能看到效果

var jsonSrc='在此输入json数据';

只要在js中输入一行代码就能看到效果。 常规数据和散列攻击数据是65536行的键值对。 我的本地测试效果如下。

根据Chrome附带的任务管理器,CPU马上升到100%,约1分钟即可完成执行,正常数据在几毫秒内完成执行

2.PHP测试

$ JSON=file _ get _ contents (https://raw.github user content.com/layne fyc/PHP _ thread _ demo/master/hashnomamamam

$开始时间=microtime (true );

$arr=JSON_decode($JSON,true );

$endtime=microtime(true );

echo ' nomal : '.(结束时间- $开始时间).) (rn );

$ JSON=file _ get _ contents (https://raw.github user content.com/layne fyc/PHP _ thread _ demo/master/hash.jash )

$开始时间=microtime (true );

$arr=JSON_decode($JSON,true );

$endtime=microtime(true );

echo ' attack : '.(结束时间- $开始时间).) (rn );

PHP通过file_get_contents远程检索数据,运行并比较时间,相差10秒以上。 php-fpm单进程占CPU的100%。

Java测试

公共字符串索引

String jsonStr=' ';

特里

{

filereader fr=new filereader (' t.log ); //要读取的文件路径

bufferedreaderbr=newbufferedreader (fr;

jsonStr=br.readLine (;

br.close (;

fr.close (; //关闭文件流

}是}catch(ioexceptione )

{

System.out.println ('指定文件不存在'); //处理异常

}

Map map=new HashMap (;

map=JSON object.from object (JSON str );

return 'Hash Collision ~';

}

Java通过阅读文件进行了测试。 Java的散列算法与PHP和JavaScript略有不同,但相似。 同样,我们构建了6万行的简单数据。 在Spring boot框架中,浏览器开始访问一次,26秒后返回结果,在此期间CPU已满。

四.其他语言还在研究中……

HashTable是一种非常通用的数据结构,由于数据结构和算法都有特殊的课程,所以Hash Collision普遍存在,各种语言在实现上只是散列算法和Table存储之间存在细微的差异。

为了验证Java的Hash冲突攻击也有效,我在端午假期阅读了Java HashTable相关的文章,经过努力,成功生成了攻击数据。 过程非常不简单。 这也验证了一个思想。 个子高的东西最后都会被分解成为基础的数据结构知识。

如何攻击

几年前的PHP版本还是5.2,我们可以将所有的hash密钥放入开机自检请求的Body中。 例如:

post data : k1=0k2=0k3=0. k 999998=0k 99999=0

获取服务端数据后,所有参数都保存在Hash Table($_POST )中,便于攻击。 但是,由于Nginx层和PHP层很容易限制Http请求的参数数量和大小,因此这种方法现在不适用。 默认情况下,PHP只允许1000个参数,此订单对服务器没有任何影响。

现在是2017年,json格式和rest风格的界面非常流行。 在为我们提供方便编码的同时,也为Hash Collision Dos提供了新的方式。 目前,许多rest风格的界面如下:

data : { ' action ' : ' create-account ',' data':''}

如上所述,将攻击的数据直接放入data参数中,服务端收到数据后一定会进行jsonDecode () )。 很容易就能达到攻击的目的。

如何防御

为了防御Hash Collision Dos攻击,业界已经有很多成熟的方案,但建议改变语言或重写HashTable。 这里只谈当前json格式分析的问题。 必须首先增加权限验证,并尽可能在jsonDecode ()之前拒绝未授权用户。 然后,在jsonDecode ()之前进行数据大小和参数的白名单验证。 如果旧项目改造和维护成本较高,建议您自行重写jsonDecode。

接下来

写了这么多,其实最有趣的地方是如何生成攻击数据。 稍后详细写这一部分。 最后,谷歌和Python能否逃脱散列冲突操作系统测试? 敬请期待

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。