一种高级的DoS攻击-Hash碰撞攻击

简介: 这是迄今为止第一个让我觉得后怕的攻击方式,涉及的范围广难以防御,攻击效果立竿见影。大量的网站和Web接口都未做Hash碰撞攻击的防御,一拿一个准。 随着RESTful风格的接口普及,程序员默认都会使用json作为数据传递的方式。

这是迄今为止第一个让我觉得后怕的攻击方式,涉及的范围广难以防御,攻击效果立竿见影。大量的网站和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格式

  1. Hash攻击json数据
  2. 普通json数据
  3. Java版本Hash攻击数据

一. 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风格的接口如下:

https://www.test.com/v1

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

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

如何防御

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

未完待续

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

新文章终于写完了,针对Java的HashTable碰撞攻击数据是如何生成的 Java Hash Collision之数据生产

再次更新PHP版本的 PHP Hash Collision攻击原理

我的博客-原文链接:一种高级的DoS攻击-Hash碰撞攻击

目录
相关文章
|
2月前
|
云安全 安全 数据库连接
什么是 DoS 和 DDoS 攻击?
【8月更文挑战第31天】
57 0
|
4月前
|
存储 安全 算法
智能合约中Gas限制和DoS攻击漏洞
智能合约中Gas限制和DoS攻击漏洞
62 7
|
监控 网络协议 安全
DoS和DDoS攻击
DoS和DDoS攻击
3326 0
|
传感器 算法 网络协议
【弹性分布式EMA】在智能电网中DoS攻击和虚假数据注入攻击(Matlab代码实现)
【弹性分布式EMA】在智能电网中DoS攻击和虚假数据注入攻击(Matlab代码实现)
343 0
|
缓存 网络协议 安全
网络安全-DoS与DDoS攻击原理(TCP、UDP、CC攻击等)与防御
网络安全-DoS与DDoS攻击原理(TCP、UDP、CC攻击等)与防御
892 0
|
安全 Shell
简单防御黑客DOS攻击shell脚本
简单防御黑客DOS攻击shell脚本
201 0
|
负载均衡 网络协议 安全
SYNPROXY:廉价的抗DoS攻击方案
DoS攻击是一个永恒的问题,虽然专业厂商的防火墙,负载均衡类的网关设备能比较有效的防御DoS攻击,但黑客们更倾向于x86+GNU/Linux的组合,原因很简单:足够的廉价。 在linux内核3.13里终于加入了SYNPROXY的新功能,这个模块是一个基于链接跟踪的netfilter扩展,主要干的工...
805 0
|
安全 网络安全 Perl
如何通过netstat命令判断是否遭受Dos攻击?遭到DDoS该如何缓解?
作为一个服务器运维人员,相信都遇到过服务器卡顿、延迟这种现象,原因有可能是脚本出错、程序BUG、服务器配置错误等,还有一种常见的可能是有人针对服务器发起了DDoS攻击,导致服务器拥堵或直接崩溃。DDos攻击是最常见的一种网络攻击方式
2722 0