哈希绕过问题其实是弱类型问题的实际应用,本质上也是应用弱类型来解题。
0e绕过
两个数不相等,但是他们的哈希值相等
有三种解决办法:数组,0e(0e32478383和0e2378238372是本身不相等但是是弱相等。注意e后面不能有字母。
以下是一些0e开头的md5值
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
数组绕过
有的时候要求我们强相等,那么我们该怎么办呢
那么就要用到数组了,因为md5要求要用字符串,你数如字符串会给你·md5值,但是如果是数字组则会爆出null,因此要满足上述条件,那么我们就可以输入两个数组,他们的md5值都会包null,那么他们的md5值便可以相等。也叫做数组绕过。
那么接下来比如我们在get一个参数a时候,怎么样去传入一个数组呢,因为我们在url后面加入?a=123,则他传入的还是字符串,我们只需要在传参的时候写成?a[]=123,那么就传入了一个数组。加入我们要传入多个数组,我们只需要要在凉饿数组之间加上&。
下面有一个题目:
第一步:要求我们通过url传入一个$a的数组。
第二步:他会严格过滤掉a[0],a[1]。
第三步:取前$a前两个元素进行拼接,执行危险命令。
那么我们怎么办呢,我们可以在输入数组时候,先输入a[2],a[3]。再输入a[0],a[1],其中2和3都是要执行的危险命令,而0和1则是正常数值。那么他会过滤0 和1 ,但是前两个元素却被保留。进行危险命令。
md5碰撞
接下来是第三种情况,要求ab都是字符串,但是后面是强相等
那么就只能进行md5碰撞了,即两不同的东西有相同的md5(原因是由于md5他的运算是由限制位数的运算,因此不能不重复的表示所有的信息,那么就会导致两个不同的信息但是他们的md5是相同的)
后面的是php的另外两种绕过,图片截取自CTF_Web:php弱类型绕过与md5碰撞_php substr绕过-CSDN博客
json绕过
array_search 绕过
CTF例题
打开源代码如上,要求我们数入一个md5参数,经过md5加密后和原来的保持一致。
这里一定要注意他要求输入的md5相当于一个参数,并不是md5值。因此我们只需要输入一个0e???的值,他md5后的值也是0e?????。就可以解出,我们需要取自己写一个脚本或者网上搜索。诸如以下。
随便选取一组,进行get就可以的到flag。