随着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攻击 异常_HashMap出现Hash DOS攻击的问题相关推荐

  1. java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令

    学习java之电脑的常用快捷键和DOS窗口下的常用命令 电脑一些常用的快捷键 win快捷键: 单独按Windows:显示或隐藏 "开始"功能表 Windows+BREAK:显示&q ...

  2. dos攻击命令_Kali Linux系列之拒绝服务攻击(DOS)实战(下)

    (你的世界是个什么样的世界?你说,我们倾听!)                                                      利用系统漏洞进行拒绝服务攻击 1.利用系统漏洞 ...

  3. dos/ddos攻击与防范_ddos和dos

    文章目录 关于DOS攻击 相关攻击案例 如何防御 关于DOS攻击 DOS攻击也叫做拒绝服务攻击 其原理是 模拟正常用户访问,但访问量巨大 大量占用服务器资源,服务器负载和网络带宽等资源总是有限的 当攻 ...

  4. Java笔记11-【异常、线程】

    主要内容 异常.线程 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指 ...

  5. 复习Java异常处理_异常分类_自定义异常_线程初步了解

    复习Java异常处理_异常分类_自定义异常_线程 主要内容 异常.线程 教学目标 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点 ...

  6. java day16 【异常、线程】

    第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指的是程序在执行过程中, ...

  7. java.lang.NullPointerException异常原因及解决

    java.lang.NullPointerException异常原因是因为创建了一个引用类型的变量却没有指向任何对象而又去通过这个引用类型变量加点的形式去访问非静态的方法及属性. 给出三种情况, 第一 ...

  8. java.lang.IllegalMonitorStateException 异常出现原因

    java.lang.IllegalMonitorStateException  违法的监控状态异常.当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛 ...

  9. 理解和解决Java并发修改异常ConcurrentModificationException(转载)

    原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java ...

  10. 深入探讨Java中的异常与错误处理

    Java中的异常处理机制已经比较成熟,我们的Java程序到处充满了异常的可能,如果对这些异常不做预先的处理,那么将来程序崩溃就无从调试,很难找到异常所在的位置.本文将探讨一下Java中异常与错误的处理 ...

最新文章

  1. 百度智能搜索到底有多智能?
  2. 英雄联盟手游主播否认部分英雄后期的作用,难道阿卡丽没未来?
  3. tomcat7 - 烫手山芋之热部署
  4. activiti dmn_新的DMN编辑器预览
  5. php factory interface,PHP设计模式之工厂方法*解读
  6. docker-compose 运行 Flask 应用最佳实践
  7. 深度学习(机器学习)模型压缩开源库整理
  8. oracle表修改语句,Oracle的常用修改表及字段的语句
  9. 代码规范以及单元测试项目
  10. 数学建模 聚类模型
  11. robotium之无name、ID仅有desc定位
  12. 台式电脑接路由器步骤_台式电脑怎么连接无线路由器
  13. ElasticSearch全文搜索引擎之term和match的区别
  14. WinUsbNet: A managed interface to WinUSB.sys
  15. 安卓脚本怎么实现在后台_用按键精灵录制微信自动摇一摇脚本
  16. 街头篮球服务器维护中,雷冥竟然有这能力? 《街头篮球》五一稀有角色能力解析...
  17. 通关!游戏设计之道的学习笔记(七)关卡设计
  18. Gromacs 伞形采样
  19. 6.5 Introduce Explaining Variable 引入解释性变量
  20. 台式计算机连接无线,台式电脑怎么连WiFi无线网络

热门文章

  1. matlab读取jpg图片出错,求助,Matlab读取图片进行分类。出现错误
  2. 如何解救爆红的C盘?
  3. UML工具大全(上)
  4. raft算法 java实现_Raft 算法在分布式存储系统 Curve 中的实践
  5. 2022前端vue面试题
  6. python 3.8.2安装教程
  7. reimage repair-打开网页总是自动跳转要你下reimage repair
  8. TM1620 LED 驱动控制 程序
  9. tf 设置多显卡_海美迪H7四代解码4k hdr局域网教程,用TF卡双启动libreELEC成功
  10. typecho图片插件_Typecho弹窗相册插件HighSlide1.4.7更新