题目源码与注释
<?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对变量转换为布尔值的特殊规则