BUUCTF在线评测-练习场-WebCTF习题[ACTF2020 新生赛]BackupFile1-flag获取、解析
解题思路
打开靶场,提示
Try to find out source file!
加上题目的
BackupFile1
提示的比较明显就是找备份文件了,常见的后缀有.bak,.backup,.zip等等
直接上dirsearch扫目录,扫到下面这个明显的备份文件
直接访问,提示下载,分析源码
<?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!";
}
前面的确保存在和确保数字就不说了,下面说核心源码
$key = intval($key);$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";if($key == $str) {echo $flag;}
这里需要理解的是函数与弱比较
intval($key)
的作用:
-
intval()
函数将$key
转换为整数。转换规则如下:-
如果
$key
是字符串,它会从字符串开头解析数字部分,直到遇到第一个非数字字符,然后返回该数字的整数值。 -
如果
$key
以非数字开头,intval()
返回 0。 -
例如:
intval("123abc")
返回123
,intval("abc123")
返回0
-
-
比较条件
$key == $str
:-
由于
$key
被intval()
转换为整数,比较实际上是整数与字符串之间的松散比较。 -
PHP 的松散比较规则:如果一边是整数,另一边是字符串,PHP 会尝试将字符串转换为数字,然后再比较。
-
因此:
-
$str
会被转换为整数123
(因为它以 "123" 开头)。 -
条件简化为:
intval($key) == 123
。
-
-
只要
intval($key)
的结果是123
,条件就成立。
-
因此,我们只要输入key为123即可
/?key=123
总结
一道基础的扫目录、代码审计的题目