最近做了一到有关MD5码的ctf,所以就顺带这道题把之前遇到的有关md5码的知识总结一下。
1、刚开始以为是sql注入,试了一下发现没什么变化,所以就查看页面源码
这里可以看到,是将我们的输入进行md5加密后再所以sql查询,然后又发现后面的Ture,这时就要去百度一下这个选项的含义
md5(string,raw)
参数 描述
string 必需。规定要计算的字符串。
raw
可选。规定十六进制或二进制输出格式:
TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数
所以我们可以知道,md5码有两种格式,一个是16字符2进制的,还有一种是32字符16进制的。16字符的可以构造sql注入字符('or '),直接绕过。
通过python脚本,基本可以知道,'or’这个字符的md5码的32位格式为276f7227,然后后面的位数随机补充,本来想通过python脚本跑出结果,发现太慢了,所以直接看别人的查询字符串,即ffifdyop。
不过我觉的我的脚本思想还是不错的
2、输入查询字符串绕过后,出现下图情况
这里md5进行了弱比较,当为0e开头的会被识别为科学记数法,结果均为0,所以我们只需构造md5码为0e开头的字符串,这里我用了QLTHNDT和QNKCDZO
输入后会得到如下界面
这里可以知道它又将md5码换成强比较,此时如果传入的两个参数不是字符串,而是数组,md5()函数无法解出其数值,而且不会报错,就会得到===强比较的值相等
因为要用POST提交,所以我使用burpsuite抓包修改提交
这里我还要补充一下另外一种md5的比较
真实md5碰撞,因为此时不能输入数组了,只能输入字符串
所以使用md5碰撞,即两个不同的文件或字符串,它的md5码其实是相同的
这里我找到了一个比较好用的工具可以很方便进行md5碰撞
here
用法
git clone https://github.com/iamjazz/Md5collision.git
cd Md5collision
在本目录中创建一个文本文件。写入任意字符或数字(eg:输入1) 。命名为init.txt
运行fastcoll 输入以下参数。 -p 是源文件 -o 是输出文件
fastcoll_v1.0.0.5.exe -p init.txt -o 1.txt 2.txt