一、哈希表碰撞攻击的基本原理

哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表。PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结构存储)。

理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值(key),然后在常量时间内定位到一个桶(术语bucket,表示哈希表中的一个位置)。当然这是理想情况下,因为任何哈希表的长度都是有限的,所以一定存在不同的数据项具有相同哈希值的情况,此时不同数据项被定为到同一个桶,称为碰撞(collision)。哈希表的实现需要解决碰撞问题,碰撞解决大体有两种思路,第一种是根据某种原则将被碰撞数据定为到其它桶,例如线性探测——如果数据在插入时发生了碰撞,则顺序查找这个桶后面的桶,将其放入第一个没有被使用的桶;第二种策略是每个桶不是一个只能容纳单个数据项的位置,而是一个可容纳多个数据的数据结构(例如链表或红黑树),所有碰撞的数据以某种数据结构的形式组织起来。

不论使用了哪种碰撞解决策略,都导致插入和查找操作的时间复杂度不再是O(1)。以查找为例,不能通过key定位到桶就结束,必须还要比较原始key(即未做哈希之前的key)是否相等,如果不相等,则要使用与插入相同的算法继续查找,直到找到匹配的值或确认数据不在哈希表中。

PHP是使用单链表存储碰撞的数据,因此实际上PHP哈希表的平均查找复杂度为O(L),其中L为桶链表的平均长度;而最坏复杂度为O(N),此时所有数据全部碰撞,哈希表退化成单链表。下图PHP中正常哈希表和退化哈希表的示意图。


哈希表碰撞攻击就是通过精心构造数据,使得所有数据全部碰撞,人为将哈希表变成一个退化的单链表,此时哈希表各种操作的时间均提升了一个数量级,因此会消耗大量CPU资源,导致系统无法快速响应请求,从而达到拒绝服务攻击(DoS)的目的。

可以看到,进行哈希碰撞攻击的前提是哈希算法特别容易找出碰撞,如果是MD5或者SHA1那基本就没戏了,幸运的是(也可以说不幸的是)大多数编程语言使用的哈希算法都十分简单(这是为了效率考虑),因此可以不费吹灰之力之力构造出攻击数据。

二、如何防御

  • 打补丁,修改hash算法。

  • 限制POST的参数个数,限制POST的请求长度。

  • 使用防火墙检测异常请求

  • 增加权限验证,最大可能的在jsonDecode()之前把非法用户拒绝

  • 重写jsonDecode()方法

分享一个可以导致hash碰撞的json串:https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/javaHash.json

使用Hash碰撞进行DoS攻击相关推荐

  1. 如何防止因哈希碰撞引起的DoS攻击

    如何防止因哈希碰撞引起的DoS攻击 理解哈希 什么是哈希 哈希和数组 哈希算法 哈希碰撞 鸽巢原理 为什么不能避免哈希碰撞 哈希算法的特点 如何解决哈希碰撞 开放寻址法 线性探测 线性探测法适用场景 ...

  2. php hash碰撞攻击与防御

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

  3. HashMap之Hash碰撞冲突解决方案及未来改进

    说明:参考网上的两篇文章做了简单的总结,以备后查(http://blogread.cn/it/article/7191?f=wb  ,http://it.deepinmind.com/%E6%80%A ...

  4. hashmap的hash碰撞问题

    碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中 Hashmap里面的bucket出现了单链表的形式,散列表要解决的一个问题就是散列值的冲突问题,通常是两种方法: 链表法和开放地址法 ...

  5. 哈希碰撞+mysql_HashMap之Hash碰撞冲突解决方案及未来改进

    HashMap位置决定与存储 通过前面的源码分析可知,HashMap 采用一种所谓的"Hash 算法"来决定每个元素的存储位置.当程序执行put(String,Obect)方法 时 ...

  6. 转帖:对linux中半增加半连接数量和防止服务器被dos攻击

    .增大队列SYN最大半连接数 在Linux中执行命令"sysctl -a|grep net.ipv4.tcp_max_syn_backlog",在返回的"net.ipv4 ...

  7. DOS攻击与网络溯源技术

    1.DoS攻击 DoS攻击(Denial of Service,拒绝服务攻击)通过消耗计算机的某种资源,例如计算资源.网络连接等,造成资源耗尽,导致服务端无法为合法用户提供服务或只能提供降级服务.在S ...

  8. HTTP POST慢速DOS攻击初探

    1. 关于HTTP POST慢速DOS攻击 HTTP Post慢速DOS攻击第一次在技术社区被正式披露是今年的OWASP大会上,由Wong Onn Chee 和 Tom Brennan共同演示了使用这 ...

  9. python dos攻击_利用SMB漏洞DoS攻击任何Windows系统

    原标题:利用SMB漏洞DoS攻击任何Windows系统 近日微软报出SMB V1存在漏洞,安全研究员并将此漏洞称作 " SMBLoris ",解释其能够发动拒绝服务(Dos)攻击, ...

最新文章

  1. 从零开始学python网络爬虫-从零开始学Python 三(网络爬虫)
  2. 想避免宕机,数据中心运营商还要不断演练实践
  3. 如何使用@component-scan排除不需要的类
  4. 面试 linux 进程通讯,【转】LINUX驱动的经典面试问题...
  5. 常用USB转串口芯片介绍
  6. .NET Framework 4.0源代码
  7. php 将前端网页输出成unicdoe编码
  8. 【补丁分析】CVE-2016-8610:对导致拒绝服务的“SSL Death Alert”漏洞补丁分析
  9. Memcached在Windows下的安装
  10. Python中DataFrame去重
  11. java模板导出excel_POI导出excel模板三种方式
  12. 计算机硬件知识ppt课件,计算机硬件课件
  13. 迅捷路由器造成计算机无法上网,迅捷(fast)路由器连不上网怎么办?
  14. 判断质数的所有方法详解(C语言)
  15. 利用POI将word转换成html实现在线阅读
  16. 【YOLO】物体识别算法的核心思想
  17. php录音功能,关于录音功能的详细介绍
  18. paddlepaddle 人脸识别爬坑指南
  19. [BZOJ1922]大陆争霸-最短路略微扩展
  20. 内蒙古自治区交通运输管理局容灾备份设备招标

热门文章

  1. xshell通过隧道连接_DNS安全之隧道攻击
  2. python os.walk模块_Python之os.walk和os.path.walk
  3. 当你和你女朋友闹矛盾时......
  4. 钱少也就算了,为啥我们还越来越忙?
  5. 看电影的第一大禁忌 | 今日最佳
  6. 在家做什么能让隔壁报警?| 今日最佳
  7. 50万年薪程序员,被百万网民怒喷后,却迎来大撕逼
  8. 第106届印度科学大会:牛顿和爱因斯坦的理论惨遭印度科学家驳斥
  9. 120天的烧脑只为孩子设计一套教具~
  10. ios和android交互差异,Android 和 iOS 主要交互区别整理