HashMap出现Hash DOS攻击的问题
随着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<String, Object> map = new HashMap<String, Object>();
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中,比如:
https://www.test.com/create-account
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测试吗?敬请期待
HashMap出现Hash DOS攻击的问题的更多相关文章
- 【网络安全】Dos攻击科普文
目录 DOS攻击 什么是DOS攻击 攻击手段分类 具体的攻击方式举例 优秀博客参考 DDOS攻击 DOS攻击 什么是DOS攻击 DOS是Denial of Service的简称,用中文简单翻译就是拒绝 ...
- HashMap的hash分析
哈希 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空 ...
- 转帖:对linux中半增加半连接数量和防止服务器被dos攻击
.增大队列SYN最大半连接数 在Linux中执行命令"sysctl -a|grep net.ipv4.tcp_max_syn_backlog",在返回的"net.ipv4 ...
- 调试JDK源代码-一步一步看HashMap怎么Hash和扩容
调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码 ...
- DoS攻击种类
DoS攻击有许多种类,主要有Land攻击.死亡之ping.泪滴.Smurf攻击及SYN洪水等. 据统计,在所有黑客攻击事件中,syn洪水攻击是最常见又最容易被利用的一种DoS攻击手法. 1.攻击原理 ...
- Linux下的DOS攻击
Linux下的DOS攻击 DOS是Denial of service的简称,即拒绝服务,造成Dos攻击行为被称为Dos攻击,其目的是使计算机或网络无法提供正常的服务.最常见的Dos攻击有计算机带宽攻击 ...
- hashmap的hash算法( 转)
HashMap 中hash table 定位算法: int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); 其中i ...
- XSS的DOS攻击之 server limit dos
墨西哥同学周末很郁闷的在宾馆上网,发现youtube被ban了,于是写个了tool解决这个问题.顺带想到了一种利用 google 统计的漏洞,写在这里了 http://sirdarckcat.blog ...
- 利用UDP19端口实施DOS攻击的真实案例
昨天在一个用户现场发现了一个利用UDP19端口对互联网受害者主机进行DOS攻击的真实案例.这个情况是我第一次见到,个人认为对以后遇到此类情况的兄弟具有参考价值.有必要做一个简单的分析记录. 在此次的分 ...
随机推荐
- assert BOOST_ASSERT的坑
下面这行代码 BOOST_ASSERT(SUCCEEDED(m_pd3dDevice->CreateBuffer(&frame_ptr->m_const_buffers[i].m_ ...
- Effective Java 第三版——83. 明智谨慎地使用延迟初始化
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- LaTeX网址
https://www.latex-project.org/ latex官网 http://www.latexstudio.net/ 国内知名latex学习中心 https://www.ove ...
- maven 使用 国内镜像的方法 解决依赖下载慢
转自:http://blog.csdn.net/banqgg/article/details/55804569 Maven是当前流行的项目管理工具,但官方的库在国外经常连不上,连上也下载速度很慢.国内 ...
- 【原创 Hadoop&Spark 动手实践 13】Spark综合案例:简易电影推荐系统
[原创 Hadoop&Spark 动手实践 13]Spark综合案例:简易电影推荐系统
- H3C Comware V3 端口聚合
通常链路聚合有三种模式:手工汇聚.静态LACP汇聚和动态LACP汇聚. 但是V3版本下只提供了 手工聚合模式 manual 和 静态LACP聚合模式 static 两种 V3版本配置链路聚合 1,创建 ...
- Unix时间转LInux时间
private static long getTime() { long currentTimeMillis = System.currentTimeMillis(); long nanoTime = ...
- halcon 动态阈值分割之偏移值
- R包的小技巧
通常我们都是直接使用library(pkg_name) 的形式加载R包,在同一台机器上面,对于我们而言,这个包所在的路径一定是在.libPaths() 路面的,但是对于其他用户而言,这个路径可能不存 ...
- 如何查看github排行热度
github热门趋势 https://github.com/trending github star排行榜 github输入:star:>数字,来查看star数的仓库: 输入:location: ...