下面会以同一道题给大家演示:
(题目来源与nssctf)
==和===
在php代码中我们会看到==和===,虽然两个都是表示相等,但是在细节上会有所部区别
==:是弱比较,只比较结果,不比较数据类型。
===:是强比较,不仅会比较结果,也会比较数据类型。
md5数组绕过
原理:
由于md5不能加密数组,在加密数组的时候会返回NULL。
如果是我们传入的两个参数相等,我们可以传入两个数组,判断条件就成为NULL=NULL,这样就可以绕过判断。
题目只需要两个不同的值,md5加密后相同就可以。传入数组,两个不同,并且加密都为NULL,相等。
这样的题目需要注意等号,如果是==,可以一个是数组,一个是整型,但是为===,就必须都是整型,或者都是数组。
科学计数法绕过
原理:
可以传入两个md5加密后是0e开头的字符串,但这个以0e开头的字符串只能是纯数字,这样php在进行科学计算法的时候会将它转化为0。
同样是上面那道题:
传入两个md5后都是0e开头的纯数字,变为0=0。
这里可以收集一些网上的字符串,没有必要每次都自己去写脚本跑。
1 | s878926199a |
双md加密
正常的方法当然是写脚本去跑,但是做题的时候遇到了,肯定可以收集一下呀。
md和md5后都是0e开头的字符串:
1 | CbDLytmyGm2xQyaLNhWn |
md5碰撞
对于md5加密的我们也可以使用md5碰撞产生相等的值。
这里使用了工具fastcoll。下载的地址:
下载压缩包解压就可以了。
然后使用的话,对着项目里的文档就可以。
同样是开头那道题:
1.首先新建init.txt文档,然后随便输入一点东西,我输入的是123456
2.然后执行 fastcoll_v1.0.0.5.exe -p init.txt -o 1.txt 2.txt
此时会在目录下生成1.txt和2.txt。
接着将Md5collision.php放在php环境中运行,注意因为要打开1.txt和2.txt,所以不要把Md5collision.php文件单独拖到php环境运行,可以直接将整个文件夹放入运行
这里我们可以看到生成的md5字符串。看着相似,但是中间是有所不同的。利用bp传入数据,可以得到flag
Hash长度攻击
使用:hashpump
一个值等于一个拼接的字符串的md5值,有长度要求
且拼接的字符串值等于一个已知字符串加上一个未知字符串,
hashpump直接根据提示传入相关数据,就会自动生成payload。
注:记得将/x换成%00
2023年楚慧杯的web题中考到了这个点,网上有wp。