题目源码与注释
<?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)""(空字符串)nullfalse[](空数组)
其他值(如"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对变量转换为布尔值的特殊规则