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 ...
随机推荐
- Eclipse 软件 Java 解决:出现的editor does not contain a main type错误框 问题
Eclipse 软件 解决:出现的 editor does not contain a main type 错误框 问题 当你运行 Java文件是,如果弹出了下面的 错误框: 出现错误的原因: 当前的 ...
- spring springMvc spring-boot spring-cloud分别是什么
本文来源于:克己习礼成仁 的<spring springMvc spring-boot spring-cloud分别是什么> 什么是spring 关于spring的定义无论是从官方还是 ...
- Confluence 6 增加和减少你许可证的用户数
增加你许可证的用户数 如果你使用的用户数超过你许可证允许的用户数的话,你的 Confluence 实例将会变成为只读. 只读的意思是没有用户可以创建和编辑内容,直到你的用户数满足你的许可证需求为止. ...
- linux之xxx 不在 sudoers 文件中,此事将被报告(转载)
linux中创建用户命令为:useradd 用户名, eg: useradd test 指定密码:passwd test 但是有时候我们需要使用test运行执行一些root用户才有权限执行的命令,此时 ...
- selenium之实现多窗口切换到自己想要的窗口
#coding=utf-8 from selenium import webdriver import time from selenium.webdriver.support import expe ...
- 【ftp】主动模式和被动模式
来自:http://blog.csdn.net/liuhelong12/article/details/50218311 原博主不让转载全文,不过下面这部分是原博主转载别人的,所以我拿过来应该没问题吧 ...
- linux下mysql源码安装
参考链接:http://blog.csdn.net/zqtsx/article/details/9378703 下载mysql安装包, 不会下载点这里 地址:ftp://mirror.switch.c ...
- ActiveSync 学习记录
协议就是一种规范.它是高效团队协作的依据.有的人可能不爱看团队规范之类的文档,一方面是个人意识问题,另外也和文档的组织.协作的效果相关. 写好文档: 看好文档. 1. 处理XML转码 抓包后,发现邮件 ...
- BZOJ 2818 Gcd(欧拉函数+质数筛选)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 9108 Solved: 4066 [Submit][Status][Discu ...
- 494. Target Sum
You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symb ...