buuctf [BJDCTF2020]Easy MD5
思路:看到url上又password字样,又有输入栏,随便传入admin然后抓包试试,发现提示。
显示select * from 'admin' where password=md5($pass,true)
分析:通过sql语句,从admin表里查数据,当password=md()函数加密后的pass时就可查询。
考点:
- sql语句注入
- md5()函数:本来应该返回32 位的十六进制数形式散列值,但是此题可选的 binary 被设置为 true,那么 md5 摘要将以 16 位的原始二进制格式返回。
看到作业提示md5在sql注入中常见的搭档是字符串ffifdyop,然后去谷歌,csdn看看这是什么东西。
ffifdyop
经过md5加密后:276f722736c95d99e921722cf9ed621c
再转换为字符串:’or’6<乱码> 即 ‘or’66�]��!r,��b
原理:md5()函数先把 **ffifdyop**
加密为**276f722736c95d99e921722cf9ed621c**
Mysql 又会把 hex (十六进制)转成 ascii 解释
在or的两边要有单引号,使它变成 password=‘xxx’or‘xxx’ 的形式
因此拼接之后的形式是select * from ‘admin’ where password=’’ or ‘6xxxxx’ 为一个永真式
输入得到代码:
1 | $a = $GET['a']; |
分析:通过get传参a,b,使得题目md5值弱相等 。
方法:
- 数组绕过
- md5()值碰撞,有一些特殊的数值在md5()加密后会形成0e开头的字符串,从而达到弱相等
md5()碰撞原理:
1 |
|
选择任何方法都行,之后得到:
1 |
|
同理,不过之后是强类型相等,估计这一关是考察数组绕过吧,之后得到flag