Easy MD5绕过
(本质应该还是sql注入)
[BJDCTF2020]Easy MD5:
前言:
什么是MD5?
一种加密方法,被发现存在碰撞漏洞后便不再使用
加密原理如下:
1 | md5('hello', true) |

并且会对’ ‘的内容优先做出如下做法:
把字符串数字转化为数字:’1’===1
会优先计算:’1+1’===’2’
更加仔细的请访问:[buuctf web BJDCTF2020]Easy MD5-CSDN博客
怎么解决强/弱运算?
1:遇到弱比较( md5(a)==md5(b) )时,可以使用 0e绕过。
1 | 输入: |
原理:由于会优先计算,导致0e会被转化为0,这样子比较起来就是正确的
也可以使用:QNKCDZO这个加密后就是:0e830400451993494058024219903391(尤其是出现md5()==0)
一些MD5值为0e开头的字符串:
1 | QNKCDZO => 0e830400451993494058024219903391 |
2:遇到强比较(a===b)时,可以使用数组绕过。
md5无法识别数组,于是就会返回NULL
1 | 输入: |
正片:
打开源码发现什么都没给我们,抓包发现提示:

告诉我们是MD5加密,于是我们便输入:
1 | ?username=ffifdyop |
便进入新的页面:
原理:
ffifdyop经过md5加密后会变成276f722736c95d99e921722cf9ed621c
再转换为字符串:’or’6(乱码) 即 'or'66�]��!r,��b
预想,数据库查询语句应为:
1 | SELECT * FROM xxx WHERE username = 'admin' and password = ".md5($password,true)." |
而在mysql中,在用作布尔型判断时,以数字开头的字符串会被当成整型,不过由于是字符串,因此后面必须要有单引号括起来的,比如:‘xxx’or’6xxxxxx’,就相当于’xxx’or 6,就相当于 ‘xxx’or true,所以返回值是true。
(整数会被恒判定为true)
所以,此时查询语句就会变成:
1 | select * from xxx where user='amdin' and password=''or'6xxxx' |
也就是,password=’ ‘ or true=true
打开源码,发现:

需要弱比较,于是我们便输入:
1 | http://6428254e-c96f-46f2-842a-0236eaa7c904.node5.buuoj.cn:81/levels91.php?a=240610708&&b=QNKCDZO |

这是以POST传输进行强比较,答案就在眼前,Rushing!!!!
输入param1[]=gx¶m2[]=lp(加一个[]会被解析为数组)
得到

注:在最后一步使用HackBar一直不行,换成MAX HackBar就行了
真神奇