[BJDCTF2020]Easy MD5( .md5( $password, true)绕过)

[BJDCTF2020]Easy MD5( .md5( $password, true)绕过)_第1张图片
随便提交都无果,bp抓包:
[BJDCTF2020]Easy MD5( .md5( $password, true)绕过)_第2张图片
password=md5($pass,true)为真时,就能够select *了,而md5()函数功能如下:
[BJDCTF2020]Easy MD5( .md5( $password, true)绕过)_第3张图片
就是说我们输入$pass时,首先会被md5加密,然后会被转换成16字符的二进制格式。这里百度了一下有这么一个字符串(这里也可以直接理解成md5后,mysql自动把md5值当成hex转化成字符串了)

ffifdyop

MD5后 276f722736c95d99e921722cf9ed621c
转换成16字符的二进制格式 'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c
mysql自动解析成string 'or’6]!r,b

所以hint里的表达式就会变成:

select * from 'admin' where password=''or'6]!r,b'

当or后面接的是一个数字的话,sql语句就变成:

select * from 'admin' where password=''or true

就能执行sql语句了:

[BJDCTF2020]Easy MD5( .md5( $password, true)绕过)_第4张图片
常见的MD5碰撞(https://blog.csdn.net/weixin_44348894/article/details/102955115),数组绕过:
[BJDCTF2020]Easy MD5( .md5( $password, true)绕过)_第5张图片
再绕一次就拿到flag了。

参考链接:
https://blog.csdn.net/March97/article/details/81222922

你可能感兴趣的:(buuctf_web)