1.extract变量覆盖
解题方法:
GET请求?flag=&shiyan=,extract()会将$flag和$gift的值覆盖了,将变量的值设置为空或者不存在的文件就满足$gift == $content
2.strcmp比较字符串
PHP的strcmp()函数在PHP5.3版本之前使用数组可以绕过验证
strcmp()用法参考:
函数期望传入的类型是字符串类型的数据,要是我们传入非字符串类型的数据的话,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 。也就是说虽然报了错,但却判定其相等了,也就绕过了判断。
3.urldecode二次编码绕过
eregi()是不区分大小写的正则匹配,进行两次url编码即可。
4.md5()函数
显然我们得构造username和password的值不相等,但是它们的md5的值相等才能得到flag
因为md5不能处理数组,可以使用数组绕过,md5(数组)会返回null,这样可以实现username!=password,但是md5(username)===md5(password)
md5()参考:http://www.w3school.com.cn/php/func_string_md5.asp
5.数组返回NULL绕过
ereg只能处理字符,而password是数组,所以返回的是null,三个等号的时候不会进行类型转换。所以null!==false。
strpos的参数同样不能够是数组,所以返回的依旧是null,null!==false也是正确。
6.弱类型整数大小比较绕过
解题思路:is_numeric()函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对于第一个空格字符会跳过空格字符判断,接着后面的判断
7.sha()函数比较绕过
第一处if ($_GET['name'] == $_GET['password'])判断时两数组确实是不同的,但在第二处else if (sha1($_GET['name']) === sha1($_GET['password']))判断时由于sha1()函数无法处理数组类型,将报错并返回false,false === false条件成立,这样就绕过了sha()函数获得flag
8.md5加密相等绕过
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
9.十六进制与数字比较
将3735929054进行十六进制转换,得到deadc0de,在转换得到的字符前加上0x,使用0xdeadc0de来进行绕过
10.ereg正则%00截断
11.strpos数组绕过
12.数字验证正则绕过
不会。