如果你是第一批做这个题的,这道题一点也不easy
打开在前端代码里面看到,输入框输入的内容实际是’password’
随意输入内容,查看响应header中的内容有一句SQL代码,可知我们要让password在md5后返回值为true
然后尬住,开搜
MD5碰撞
总结ctf中 MD5 绕过的一些思路
ffifdyop——绕过中一个奇妙的字符串
BJDCTF2020 Easy MD5(详细
BUUCTF [BJDCTF2020]Easy MD5 详解
sql注入:md5($password,true)
根据以上信息
在其他wp和博客中得知:
md5函数在指定了true的时候,是返回的原始 16 字符二进制格式。也就是说会返回这样子的字符串:'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c
然后就会拼接成:
select * from 'admin' where password=''or'6.......'
这句在MySQL 中会形成“永真”,和常规的sql注入password=''or’1逻辑一致
要注意本题中password= 后面直接就是md5()函数
返回的字符串本是'or'6.......
得到为什么不是 password='or' 6
,而password='
肯定会报错
原因是,md5()函数返回值的类型是字符串,会再带一对 ''
所以得到的确实是password=''or' 6........'
这要令password的值在md5加密后
在其他wp中,知道了ffifdyop
这个特殊字符串,刚好符合'or'6
:
ffifdyop绕过原理是:
ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ’ or ‘6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from ‘admin’ where password=’ ’ or ‘6xxxxx’,等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。
输入ffifdyop后,得到:
查看前端代码,看到一段注释的代码
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->
这个在我的练习4,我遇到过,直接输入两个数组类型并且不一样的值就能绕过
因为md5函数输入数组返回null
null =null成立
payload:?a[]='123'&b[]='1234'
成功,又看到了一组代码
这一组也是一样的解法,数组绕过md5
flag{bb709a3d-2f98-41f9-b26c-5dd79df15d4a}