本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助

打开靶机,

提示让我们找找源文件,F12查看源码没有看到有用的信息,
使用dirsearch扫描网站

注意到index.php.bak文件
通过URL下载

代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
include_once "flag.php"; //引入了包含flag变量的文件

if(isset($_GET['key'])) { //验证是否GET传入key参数,如果有就赋值
$key = $_GET['key'];
if(!is_numeric($key)) { //检查key是否为数字
exit("Just num!");
}
$key = intval($key); //将key转换为整数
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) { //弱比较
echo $flag;
}
}
else {
echo "Try to find out source file!";
}

PHP在弱比较(==)时,会尝试将字符串转换为数字
对于”123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3”,PHP会取前面的数字部分”123”
所以当$key转换为整数后等于123时,比较会成立
所以直接传入赋值123的key参数

获得flag

弱比较与强比较

在PHP中,比较运算符分为松散比较(弱比较,==)和严格比较(强比较,===),它们在比较时的行为有显著差异。

弱比较(松散比较)

松散比较只比较是否相等,会进行类型转换
特点:
1.如果比较的两个值类型不同,PHP会尝试将它们转换为相同类型后再比较
2.转换规则遵循PHP的类型转换规则
3.可能导致意外的比较结果

1
2
3
4
5
123 == "123"      // true (字符串转换为数字)
0 == "abc" // true (字符串转换为0)
false == "0" // true (两边都转换为false)
null == "" // true (两边都转换为false)
"123abc" == 123 // true (字符串转换为123)

强比较(严格比较)

严格比较同时比较类型
特点:
1.只有当值和类型都相同时才返回true
2.不进行任何类型转换
3.更安全、更可预测

1
2
3
4
123 === "123"    // false (数字 vs 字符串)
0 === "0" // false (数字 vs 字符串)
false === 0 // false (布尔 vs 数字)
null === "" // false (null vs 字符串)