CTFer blogs--hash比较绕过

1.PHP弱类型

===和==的区别:

===在进行比较时,会先判断类型是否相同,再进行比较

==  在进行比较时,会先将字符串类型转化相同,再比较

转换规则: 

字符串的开始部分决定了它的值,如果以合法的数值开始,则使用该数值,否则为0

eg. admin==0

  1admin=1

  0e123456==0e456789  相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等

 

2.MD5比较绕过

(1)不完全比较绕过

a!=b (此处!=表示严格不等于 !==表示不等于)

但md5(a)==md5(b)

思路:找到两个均为0e开头的md5值的a和b

符合要求的md5:

$a                       md5($a)
QNKCDZO        0e830400451993494058024219903391
240610708        0e462097431906509019562988736854
s878926199a    0e545993274517709034328855841020
s155964671a    0e342768416822451524974117254469
s214587387a    0e848240448830537924465865611904

特例:

如果出现要求 a=md5(a)

$a            md5($a)
0e00275209979 0e551387587965716321018342879905
0e00506035745 0e224441551631909369101555335043
0e00540451811 0e057099852684304412663796608095
0e00678205148 0e934049274119262631743072394111
0e00741250258 0e899567782965109269932883593603
0e00928251504 0e148856674729228041723861799600

特特例:

双重md5加密后的0e字符串

$a                                             md5(md5($a))
7r4lGXCH2Ksu2JNT3BYM        0e48d320b2a97ab295f5c4694759889f
CbDLytmyGm2xQyaLNhWn        0e3a5f2a80db371d4610b8f940d296af
770hQgrBOjrcqftrlaZk        0e2756da68ef740fd8f5a5c26cc45064

 

(2)null值绕过

题目要求:

$a!=$b
md5($a)===md5($b)

对于这种强比较问题,使用两个不同的数组 使其值均为null,实现绕过

a[]=1&b[]=2

 

(3)碰撞绕过

题目要求:

(string)$a!==(string)$b
md5($a)===md5($b)

思路:找到两个不同的数据,md5加密后相同

url编码数据1:
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
url编码数据2:
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

#md5(urldecode())结果均为008ee33a9d58b51cfeb425b0959121c9

 

(4)特殊md5值

问题:

select * from 'admin' where password=md5($pass,true)

解答:

ffifdyop 这个字符串被md5哈希会变成276f722736c95d99e921722cf9ed621c

这几个字符前几位刚好是or‘6,而mysql刚好又会把hex转成ascii解释,

因此拼接后就是where password = "or '6xxxx'.(为什么是永真式呢,因为6xxxxx,其实在布尔判断中是相当于true的)

等价于一个or永真式,相当于万能密码,绕过md5了

 

(5)文件绕过

linux使用md5collgen碰撞生成两个md5值相同但内容不同的文件

md5collgen -o 1.bin 2.bin

windows可以下载fastcoll,碰撞生成两个md5值相同但内容不同的文件

fastcoll.exe -p 123.txt -o 1.txt 2.txt

 

posted @ 2024-01-26 12:40  Heck1ng  阅读(76)  评论(0)    收藏  举报