繼上一篇php各版本的姿勢(不同版本的利用特性),文章總結了php版本差異,現在在來一篇本地日記總結的php黑魔法,是以前做CTF時遇到並記錄的,很適合在做CTF代碼審計的時候翻翻看看。
一、要求變量原值不同但md5或sha1相同的情況下
1.0e開頭的全部相等(==判斷)
240610708 和 QNKCDZO md5值類型相似,但並不相同,在”==”相等操作符的運算下,結果返回了true.
Md5和sha1一樣
2.利用數組繞過(===判斷)
Md5和sha1對一個數組進行加密將返回NULL;而NULL===NULL返回true,所以可繞過判斷。
二、Strcmp利用數組繞過
查看php的手冊
int strcmp ( string $str1 , string $str2 )
Return Values
Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.
當輸入的兩個值為不是字符串時就會產生不預期的返回值:
比如
<?php $password=$_GET['password']; if(strcmp('am0s',$password)){ echo 'false!'; }else{ echo 'success!'; } ?>
這樣一段代碼中,輸入password[]=1則返回success,成功繞過驗證
三、當有兩個is_numeric判斷並用and連接時,and后面的is_numeric可以繞過
$a=$_GET['a']; $b=$_GET['b']; $c=is_numeric($a) and is_numeric($b); var_dump(is_numeric($a)); var_dump(is_numeric($b)); var_dump($c); //$b可以不是數字,同樣返回true $test=false and true; var_dump($test); //返回true
四、NULL,0,”0″,array()使用==和false比較時,都是會返回true的
五、Eregi匹配
- 數組繞過
ereg是處理字符串,傳入數組之后,ereg是返回NULL
- %00截斷繞過
http://www.secbox.cn/hacker/1889.html
六、接收參數$a得存在,並且$a==0可用.繞過(非數字都可繞過)
PHP
測試代碼: <?php $a=$_GET['a']; if ($a==0) { echo "1"; } if ($a) { echo "must"; }
七、接收參數中不能出現某一字符,但下面又必須使用可以php://偽協議繞過
目前遇到的是file_get_contents其他情況具體而定
八、is_numeric繞過
空格、t、n、r、v、f、+、-能夠出現在參數開頭,“點”能夠在參數任何位置,E、e只能出現在參數中間。
九、php5,3,29,這里可以直接用%0b繞過s(空白字符)的匹配
十、既是0又是1的情況
$a==1&$test[$a]=t時
- php精度(16以上)var_dump(9999999999999999999==1);//true
- 科學計數法 .1e1 echo $b[‘.1e1’]//輸出t
.是字符串所以在數組里面變成0,但在is_numeric中有點則正常輸出為數字
十一、當switch沒有break時可以繼續往下執行
<?php if (isset ( $_GET ['which'] )) { $which = $_GET ['which']; switch ($which) { case 0 : case 1 : case 2 : echo $which . '.php'; break; default : echo "1"; break; } } $which進入循環時沒有break則按順序