这是迄今为止第一个让我觉得后怕的攻击方式,涉及的范围广难以防御,攻击效果立竿见影。大量的网站和Web接口都未做Hash碰撞攻击的防御,一拿一个准。

随着RESTful风格的接口普及,程序员默认都会使用json作为数据传递的方式。json格式的数据冗余少,兼容性高,从提出到现在已被广泛的使用,可以说成为了Web的一种标准。无论我们服务端使用什么语言,我们拿到json格式的数据之后都需要做jsonDecode(),将json串转换为json对象,而对象默认会存储于Hash Table,而Hash Table很容易被碰撞攻击。我只要将攻击数据放在json中,服务端程序在做jsonDecode()时必定中招,中招后CPU会立刻飙升至100%。16核的CPU,16个请求就能达到DoS的目的。

所有测试程序都在Mac Pro下进行,为了测试方便我只构造了65536条json键值对,真正发起攻击时可以构造数十万甚至百万千万的数据。

几个简单的Demo

攻击数据我已经转换为json格式

一. JavaScript测试

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

var jsonSrc = '这里输入json数据';

我们只需要在js中输入一行代码就能看到效果,普通数据和Hash攻击数据都是65536行键值对。我本地测试的效果如下:

通过Chrome自带的任务管理器可以看出CPU马上升到100%,将近1分钟才执行完成,而普通的数据几毫秒就能执行完成;

二. PHP测试

$json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hashNomal.json");

$startTime = microtime(true);

$arr = json_decode($json,true);

$endTime = microtime(true);

echo "Nomal:".($endTime - $startTime)."\r\n";

$json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hash.json");

$startTime = microtime(true);

$arr = json_decode($json,true);

$endTime = microtime(true);

echo "Attack:".($endTime - $startTime)."\r\n";

PHP中我们通过file_get_contents远程去拿数据,运行对比一下时间,相差10多秒,php-fpm单进程占用CPU 100%。

三. Java测试

public String index(){

String jsonStr = "";

try

{

FileReader fr = new FileReader("t.log");//需要读取的文件路径

BufferedReader br = new BufferedReader(fr);

jsonStr = br.readLine();

br.close();

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

}catch(IOException e)

{

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

}

Map map = new HashMap();

map = JSONObject.fromObject(jsonStr);

return "Hash Collision ~";

}

Java中我们通过读文件的方式做测试,Java的Hash算法与PHP和JavaScript有略微的差别,但是大同小异,我们同样构造了6万行简单的数据。Spring boot框架中浏览器发起一次访问,26秒之后才返回结果,期间CPU被打满。

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

HashTable是很通用的数据结构,数据结构与算法上专门有一节课来说它,所以Hash Collision是普遍存在的,各语言在实现上只是散列算法和Table存储上有细微差别。

为了验证Java的Hash碰撞攻击也生效,我整个端午假期都在看Java HashTable相关的文章,经过努力最后还是成功的生成了攻击数据。过程非常不简单,这也验证了一个思想--所有高个上的东西最后分解出来都是基础的数据结构知识。

如何攻击

几年前PHP的版本还是5.2,我们可以把所有的Hash Key都放在POST请求的Body中,比如:

Post Data: k1=0&k2=0&k3=0...k999998=0&k999999=0

服务端拿到数据后会将所有参数存储到Hash Table($_POST)中,通过这种方式能很方便的实现攻击。但是现在这种方式行不通了,因为我们很容易就能在Nginx层和PHP层限制Http请求的参数个数和大小。PHP默认只允许1000个参数,这个量级对服务器完全没影响。

现在是2017年,json格式和RESTful风格的接口已经非常流行。带给我们便捷编码的同时,也给Hash Collision Dos提供了新的方式。现在很多RESTful风格的接口如下:

Data: {"action":"create-account","data":""}

如上接口,我们直接把攻击的数据放入data参数中,服务端接收到数据后肯定会做jsonDecode(),很方便的就达到了攻击的目的。

如何防御

要想防御Hash Collision Dos攻击,行业内已经有很多成熟的方案了,不过都是建议换语言或者重写HashTable。这里只说当前json格式解析的问题。首先我们需要增加权限验证,最大可能的在jsonDecode()之前把非法用户拒绝。其次在jsonDecode()之前做数据大小与参数白名单验证。旧项目的改造与维护成本如果很高,建议自己重写jsonDecode()方法。

未完待续

写了这么多,其实最有乐趣的地方还是如何生成攻击数据。之后我会详细的写这部分。最后,Golang和Python能躲过Hash Collision Dos测试吗?敬请期待

java dos攻击_一种高级的DoS攻击-Hash碰撞攻击相关推荐

  1. Java生成随机数的几种高级用法

    转载自 进阶 | Java生成随机数的几种高级用法! 言归正传,众所周知,随机数是任何一种编程语言最基本的特征之一.而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数.看似简单,但有时我们也 ...

  2. php hash碰撞攻击与防御

    一.前言 hash碰撞攻击就是构造恶意的数据是hash表退化为链表,每次插入数据都会遍历链表,消耗大量服务器资源,从而达到攻击目的.php的数组就是利用hash表实现的,对于碰撞的数据,php采用双向 ...

  3. java 序列化 文件_一种恢复Java序列化文件数据的方法与流程

    本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法. 背景技术: 在数据解析恢复领域经常会遇到序列化文件的解析.Java序列化是Java 自身提供的一种数据序列化方式,它允许开发 ...

  4. java 过滤脚本_【快学SpringBoot】过滤XSS脚本攻击(包括json格式)

    XSS攻击是什么 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安 ...

  5. java视频保存_一种Java实现存储视频收视率的方法与流程

    本发明涉及Java程序设计技术领域,尤其涉及一种Java实现存储视频收视率的方法. 背景技术: 在项目研发过程中,遇到这样一个需求.客户想要将用户在机顶盒上观看的直播频道.点播影片等用户行为存储到数据 ...

  6. 拒绝服务攻击是对计算机网络的哪种,信息安全技术题库:DoS攻击是一种对网络危害巨大的恶意攻击,其中,具有代表性的攻击手段包括SYN洪泛、ICMP洪泛、UDP洪泛等。()...

    相关题目与解析 ●网络安全包含了网络信息的可用性.保密性.完整性和真实性.防范Dos攻击是提高(2)的措施,数字 在对计算机或网络安全性的攻击中,修改是对网络()的攻击.A.保密性B.完整性C.可控性 ...

  7. java架构师_前谷歌高级Java架构师分享工作8年经验(如何成为一名架构师)

    很多工作一定年限的程序员感觉自己到了瓶颈不知道怎么去突破,其实这个时候就要冲破传说中的架构师. 架构师是个很神秘人物,那么架构师的技术一般在什么程度呢?怎样才能被称为架构师? 技术深度 有没有看过JD ...

  8. java卡 应用_一种实现多发行方的多应用Java卡的方法与流程

    本发明涉及智能卡 技术领域: :,尤其涉及一种实现多发行方的多应用Java卡的方法. 背景技术: ::在GlobalPlatform组织发布的卡片规范中,有且只有一个发行方,该发行方是卡片的拥有者并最 ...

  9. java excel生成_两种方式实现java生成Excel

    Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...

  10. java nio 框架_几种Java NIO框架的比较(zz)

    问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina  xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我的印象中.不管是什么NIO ...

最新文章

  1. 修改属性使按钮处于无验证状态
  2. Android 自定义View的使用纪要!!!
  3. mysql rollup 排序_MySQL基础实用知识集合(二)
  4. java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...
  5. python 模块学习--Numpy
  6. VUE项目中 获得多个复选框 checkbox 选中的值(jquery)+ 解决 Uncaught TypeError: Cannot read property ‘push‘ of undefine
  7. python lxml xpath_Python/lxml/Xpath:如何找到包含特定文本的行?
  8. 同义反复,相似的表达
  9. java多线程常用方法_Java多线程入门中几个常用的方法
  10. 中兴android.process.acore,中兴天机Grand SII第三方系统刷机包(卡刷包)
  11. 关于内网使用Nginx正向代理发送极光推送
  12. 计算机的发明人是约翰用英语,电脑发明者是谁:约翰·冯·诺依曼(发明于1946年)...
  13. python生成泊松分布随机数_python-介绍泊松分布(poisson分布)
  14. 程序流程图 分别用N-S图和PAD图、伪码表示。n阶乘(软件工程)
  15. 如何将chrome浏览器的默认语言改成中文呢?
  16. 前端踩坑日记 npm install -g ...
  17. web实验2 制作简单网页(HTML+CSS)
  18. 社群运营有哪六种裂变模型?
  19. 美团云:迈出云服务一大步
  20. 数学建模——派出所选址

热门文章

  1. python 多行注释 unicode error 问题
  2. 在线多功能工具箱php源码
  3. 微信小程序图片加载错误,显示优化
  4. java 类型通配符_通配符类型
  5. pdf权限密码 找回
  6. 未来教育计算机二级答案,未来教育计算机二级操作题答案.docx
  7. SLA打印机之打印机介绍
  8. 什么是token?token是用来干嘛的?
  9. 1.为什么要使用token,token是什么?
  10. 需求分析及技术方案设计