題目源碼與注釋
<?php
show_source("index.php"); // 顯示自身源碼,方便分析
include("flag.php"); // 包含flag變量
$a = @$_GET['a']; // 獲取GET參數a,@抑制報錯// 關鍵判斷
if($a == 0 and $a){echo $flag; // 滿足條件則輸出flag
}
題目考點
- PHP弱類型比較(
==
)- PHP的布爾值判斷
- GET參數類型轉換
關鍵條件分析
1. $a == 0
PHP中==
是弱類型比較。
- 字符串與數字比較時,PHP會嘗試將字符串轉為數字。
- 轉換規則:
- 字符串以數字開頭(如
"0abc"
、"0.0foo"
)會被轉為數字(如"0abc"→0
)。 - 字符串不以數字開頭(如
"abc"
)會被轉為0
。
- 字符串以數字開頭(如
示例:
"0abc" == 0 為true
"abc" == 0 為true
2. $a
的布爾值
PHP中以下值會被當作false
:
0
(整數0)0.0
(浮點數0)"0"
(字符串0)""
(空字符串)null
false
[]
(空數組)
其他值(如"0abc"
、"abc"
、" "
(空格字符串))均為true
。
條件交集與payload分析
$a 值 | $a==0 | $a 為真 | 能否通過 |
---|---|---|---|
0 | true | false | 否 |
"0" | true | false | 否 |
"" | true | false | 否 |
null | true | false | 否 |
false | true | false | 否 |
[] | true | false | 否 |
"abc" | true | true | 是 |
"0abc" | true | true | 是 |
" " | false | true | 否 |
"1" | false | true | 否 |
有效payload:
?a=abc
?a=0abc
?a=test
?a=123abc
代碼執行流程
常見陷阱(就是提醒大家要兩個點都要兼顧)
- 傳遞
?a=0
、?a=0.0
、?a="0"
、?a=
(空):雖然==0
為true
,但布爾值為false
。 - 傳遞
?a=1
:布爾值為true
,但1==0
為false
。
總結
本題主要考察PHP語言中的兩個關鍵特性:
- 弱類型比較機制:PHP在比較不同類型變量時會進行自動類型轉換
- 布爾值判斷規則:PHP對變量轉換為布爾值的特殊規則