BasicPHP

Hello world,hello blog!

Posted by 吴柚 on April 13, 2019

源码分析

从源码分析可得到,需要在客户端输入(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。