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 ...
随机推荐
- Confluence 6 数据库整合的限制
数据库整合的限制 注意: Confluence 自带的 XML 方式导出方法并不适用于备份和整合大数据集.这里有一些第三方的数据库工具你可以使用能够帮助你对大数据集进行备份和整合.如果你在选择正确工具 ...
- java 自动包装功能
基本类型直接存储在堆栈中 基本类型所具有的包装容器,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型 基本类型与包装容器类对应如下:boolean Booleanbyte Byte short ...
- bzoj 2427
非常好的一道题,可以说是树形dp的一道基础题 首先不难发现,:如果我们把有关系的两个点用有向边相连,那么就会形成一个接近树的结构.如果这是一棵完美的树,我们就可以直接在树上打背包了 但是这并不是一棵完 ...
- easyui合并多个单元格
$('#table-v2').datagrid({ url: './data/am/data1_table.json', pagination: true, //显示分页 fit: true, //d ...
- 论文阅读笔记十三:The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation(FC-DenseNets)(CVPR2016)
论文链接:https://arxiv.org/pdf/1611.09326.pdf tensorflow代码:https://github.com/HasnainRaz/FC-DenseNet-Ten ...
- hive内group by取第一条数据,Hive中row_number的使用
1.hive的分组和组内排序---语法 语法: row_number() over (partition by 字段a order by 计算项b desc ) rank rank是排序的别名 par ...
- Entity Framework介绍
1.Entity Framework介绍 下图显示EF整体架构.现在我们来看看架构的各个组件: EDM(Entity Data Model): EDM由三个主要部分组成:概念模型,映射和存储模型.映射 ...
- POJ 2914 Minimum Cut【最小割 Stoer-Wangner】
题意:求全局最小割 不能用网络流求最小割,枚举举汇点要O(n),最短增广路最大流算法求最大流是O(n2m)复杂度,在复杂网络中O(m)=O(n2),算法总复杂度就是O(n5):就算你用其他求最大流的算 ...
- Java实现Redis消息队列
这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...
- python安装plinter
我下的python2.7是有pip的,但是直接在cmd中输入pip是无响应的.要去环境变量中配置D:/python/Script 这样就可以了. pip install splinter就能下载了