源码分析
从源码分析可得到,需要在客户端输入(name)、(password)、(test)
并且如果想要获得flag,必须满足两个条件:
(test)的MD5值为0;
(name)和(password)值一开始不相同,而sha1后相同;
MD5绕过(hash比较缺陷)和sha1绕过
MD5绕过
google后得知,有一批MD5开头为0e的字符串
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。由于test的MD5值为0,因此从上述中选择一个字符串即可。
sha1绕过
获得flag要求的条件是:name != password & sha1(name) == sha1(password)
此时就可以利用sha1()函数的漏洞来绕过。如果把这两个字段构造为数组,如:
name[]=a&password[]=b
这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回NULL,if 条件成立,获得flag。
解题
由上述所得,,直接在url地址栏输入?name[]=a&password[]=b&test=QNKCDZO
,即可得到flag。