打开输入字符后提交没有回显,查看header发现有hint。重点是md5函数,用法: md5(*string*, *raw*=FALSE)
,当只接受一个参数时会返回字符串的md5值,当把第二个参数的值设置为TRUE,会返回生成md5值的二进制格式,即根据ascii码值转码。
根据这个特性,就存在一个漏洞,如果password=md5($pass,true)凑巧构成了一个永真条件,是不是就可以绕过密码了?对吧。
有这样一个字符串:ffifdyop,他md5(ffifdyop,true)='or'6�]��!r,��b
可以观察到出现了or 6,6为非零数在php在代表true
输入ffifdyop,点击提交查询,进入下一个页面
什么都没有,直接查看网页源代码,最上面有一行被注释的代码,显然是提示
这里要求a,b参数不相等,但md5值要相等。我们知道php==比较是弱类型比较,另外还有一个漏洞为如果传入的不是字符串类似会报错从而返回0,可以传入两个数组。这里php版本为7.3.13,尝试了这个漏洞行不通。
弱类型比较绕过中的hash比较,当两个字符串都为科学计数法的形式时,返回为true
这里用QNKCDZO和s878926199a,payload为a=QNKCDZO&b=s878926199a
注意这里md5比较是强类型比较,这里就得换payload了。要求参数不相等,但md5码要相等。我们就利用md5无法处理数组,然后都返回null,null=null(php中null和FALSE的值相等)然后就绕过了这个。
输入payload:param1[]=1¶m2[]=a
即可得到flag,注意这里为POST类型