1.extract變量覆蓋

解題方法:
GET請求?flag=&shiyan=,extract()會將$flag和$gift的值覆蓋了,將變量的值設置為空或者不存在的文件就滿足$gift == $content
2.strcmp比較字符串

???????????????????????? PHP的strcmp()函數(shù)在PHP5.3版本之前使用數(shù)組可以繞過驗證???????????????????????????????????
strcmp()用法參考:
????? 函數(shù)期望傳入的類型是字符串類型的數(shù)據(jù),要是我們傳入非字符串類型的數(shù)據(jù)的話,這個函數(shù)將發(fā)生錯誤,但是在5.3之前的php中,顯示了報錯的警告信息后,將return 0 。也就是說雖然報了錯,但卻判定其相等了,也就繞過了判斷。
3.urldecode二次編碼繞過

eregi()是不區(qū)分大小寫的正則匹配,進行兩次url編碼即可。
4.md5()函數(shù)

顯然我們得構(gòu)造username和password的值不相等,但是它們的md5的值相等才能得到flag
因為md5不能處理數(shù)組,可以使用數(shù)組繞過,md5(數(shù)組)會返回null,這樣可以實現(xiàn)username!=password,但是md5(username)===md5(password)
md5()參考:http://www.w3school.com.cn/php/func_string_md5.asp
5.數(shù)組返回NULL繞過

ereg只能處理字符,而password是數(shù)組,所以返回的是null,三個等號的時候不會進行類型轉(zhuǎn)換。所以null!==false。
strpos的參數(shù)同樣不能夠是數(shù)組,所以返回的依舊是null,null!==false也是正確。
6.弱類型整數(shù)大小比較繞過

解題思路:is_numeric()函數(shù)對于空字符%00,無論是%00放在前后都可以判斷為非數(shù)值,而%20空格字符只能放在數(shù)值后。所以,查看函數(shù)發(fā)現(xiàn)該函數(shù)對于第一個空格字符會跳過空格字符判斷,接著后面的判斷
7.sha()函數(shù)比較繞過

第一處if ($_GET['name'] == $_GET['password'])判斷時兩數(shù)組確實是不同的,但在第二處else if (sha1($_GET['name']) === sha1($_GET['password']))判斷時由于sha1()函數(shù)無法處理數(shù)組類型,將報錯并返回false,false === false條件成立,這樣就繞過了sha()函數(shù)獲得flag
8.md5加密相等繞過

PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經(jīng)過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0。
9.十六進制與數(shù)字比較

將3735929054進行十六進制轉(zhuǎn)換,得到deadc0de,在轉(zhuǎn)換得到的字符前加上0x,使用0xdeadc0de來進行繞過
10.ereg正則%00截斷

使用數(shù)組繞過
11.strpos數(shù)組繞過

使用數(shù)組進行繞過
12.數(shù)字驗證正則繞過
不會。