-
- 正文
-
- 一、.bak备份文件泄露
- [二、PHP 中的 `==`(松散比较) vs `===`(严格比较)](#二、PHP 中的
==(松散比较) vs===(严格比较)) - 三、构造请求,获取flag
正文
一、.bak备份文件泄露
访问题目主页,页面只显示一句话:
Try to find out source file!

这提示我们要去找源代码文件。常见的备份文件名后缀有:
| 后缀 | 示例 | 说明 |
|---|---|---|
.bak |
index.php.bak |
最常见的备份文件 |
~ |
index.php~ |
vim 编辑器的临时文件 |
.swp |
index.php.swp |
vim 交换文件 |
.swo |
index.php.swo |
vim 交换文件 |
.save |
index.php.save |
保存的备份 |
.old |
index.php.old |
旧版本备份 |
直接尝试最常见的备份文件名 index.php.bak:
bash
curl "http://目标地址/index.php.bak"

成功下载到源码,内容如下:
php
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
这段代码的逻辑是:
-
- 检查
$_GET['key']是否存在
- 检查
-
- 用
is_numeric()检查$key是否为数字------如果不是,输出 "Just num!" 并退出
- 用
-
- 用
intval($key)把$key转为整数
- 用
-
- 用
==(松散比较 )判断$key是否等于$str
- 用
-
- 如果相等,输出
$flag
- 如果相等,输出
关键在 == 与 === 的区别。
二、PHP 中的 ==(松散比较) vs ===(严格比较)
| 比较方式 | 说明 | 示例 |
|---|---|---|
== |
只比较值,不比较类型,会自动类型转换 | 123 == "123abc" → true |
=== |
同时比较值和类型,不会自动转换 | 123 === "123abc" → false |
为什么
123 == "123ffwsfwefwf24r..."是 true?当 PHP 用
==比较一个整数和一个字符串时,PHP 会尝试把字符串转换成整数 ,转换规则是:从字符串开头取连续的数字字符,直到遇到第一个非数字字符为止
所以
"123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3"转换成整数就是:
"123" → 遇到 f(非数字)→ 停止 → 得到 123因此
123 == 123→ true ✅
三、构造请求,获取flag
直接给 key 参数传值 123:
bash
curl "http://目标地址/?key=123"

返回 Flag。