本题用到了post&get请求和php的弱类型比较和强类型比较的内容。
访问页面:
根据提示一行一行来
1-3行讲的是flag.php这里有个flag,4-6给了两个变量,用get的方式获取。
第七行,是一个php的强类型比较,要使gg和idmd5加密后的内容相同,单从MD5内容相同来看,是很难实现的,所以看这个强类型比较。
强比较:使用三个 ''==='' 比较,比较值,也比较类型。先判断a,b类型,若相同,则比较值,若不相同,则返回false
强类型的绕过有两种:1、使用md5值完全相同的值绕过;2、使用数组绕过。
由于这本来已经使用了MD5,那只能使用数组了,构造payload:
/?gg[]=1&id[]=2
回车验证了一下,第一步成功
第9-16行是if的嵌套,意思是passwd变量,用post请求提交,当它不是数值的时候进行下一个if比较,当它和1234567弱类型比较值为true时输出flag的值。
这里涉及两个if比较,不了解is_numeric函数的可以去搜一下,这个if的要求就是passwd不是数字型。
而弱类型比较的特点是:1、使用两个 ''=='' 比较,只比较值,不比较类型;2、a==b 将a,b的值转换成同类型再比较值
这文章有具体介绍php强弱类型的比较特点和绕过方法:php的强弱类型比较_南欢richrich的博客-CSDN博客
具体的弱类型比较规则在这里就不赘述了,因为可以通过弱类型比较的特点构造字符型和数字型进行比较,所以可以构造payload:
passwd=1234567a
题目要求使用post方法,可以使用burp抓包进行改包,也可以用火狐的插件hackbar进行post请求的发送。
最后,在post和get请求的共同发送下,成功获取flag