少女祈祷中...

Easy MD5绕过

(本质应该还是sql注入)

[BJDCTF2020]Easy MD5:

前言:

什么是MD5?

一种加密方法,被发现存在碰撞漏洞后便不再使用

加密原理如下:

1
2
md5('hello', true)
md5('hello', false)

img

并且会对’ ‘的内容优先做出如下做法:

把字符串数字转化为数字:’1’===1

会优先计算:’1+1’===’2’

更加仔细的请访问:[buuctf web BJDCTF2020]Easy MD5-CSDN博客

怎么解决强/弱运算?

1:遇到弱比较( md5(a)==md5(b) )时,可以使用 0e绕过。

1
2
3
4
输入:
var_dump(md5(0e123) == md5(0e456));
输出:
bool(true)

原理:由于会优先计算,导致0e会被转化为0,这样子比较起来就是正确的

也可以使用:QNKCDZO这个加密后就是:0e830400451993494058024219903391尤其是出现md5()==0

一些MD5值为0e开头的字符串

1
2
3
4
5
6
QNKCDZO   => 0e830400451993494058024219903391
240610708 => 0e462097431906509019562988736854
s878926199a => 0e545993274517709034328855841020
s155964671a => 0e342768416822451524974117254469
s214587387a => 0e848240448830537924465865611904
s214587387a => 0e848240448830537924465865611904

2:遇到强比较(a===b)时,可以使用数组绕过。

md5无法识别数组,于是就会返回NULL

1
2
3
4
5
6
7
8
9
输入:
$a = array(1,2,3);
$b = array(4,5,6);

var_dump(md5($a)===md5($b));
输出:
Warning: md5() expects parameter 1 to be string,
Warning: md5() expects parameter 1 to be string,
bool(true)

正片:

打开源码发现什么都没给我们,抓包发现提示:

屏幕截图 2025-02-26 221432

告诉我们是MD5加密,于是我们便输入:

1
?username=ffifdyop

便进入新的页面:屏幕截图 2025-02-27 161056

原理:

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

打开源码,发现:

image-20250227164849313

需要弱比较,于是我们便输入:

1
http://6428254e-c96f-46f2-842a-0236eaa7c904.node5.buuoj.cn:81/levels91.php?a=240610708&&b=QNKCDZO

image-20250227165209961

这是以POST传输进行强比较,答案就在眼前,Rushing!!!!

输入param1[]=gx&param2[]=lp(加一个[]会被解析为数组)

得到

image-20250227171354635

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

真神奇