![](https://file.jishuzhan.net/article/1729384892833206274/5c8cd2ef58775509ba04d8f6704e5c21.webp)
打开题目就一句话:尝试找到源文件
和上一题一样,用dirsearch扫描网站找到了一下内容
![](https://file.jishuzhan.net/article/1729384892833206274/a21ffd1fb333521b6fc411be4ac6aa3b.webp)
flag.php,0B,虚假flag
瞅一眼index.php.bak是啥
![](https://file.jishuzhan.net/article/1729384892833206274/9e6ef20504f36febf720688504dff907.webp)
下载了一个文件,把bak后缀删掉,打开了index.php源码
![](https://file.jishuzhan.net/article/1729384892833206274/9880e93f18bc5facdca622e344742e92.webp)
is_numeric(): 检查变量是否为数值
is_numeric()函数用于检查一个变量是否为数值,并返回一个布尔值,即true(1)或者false(空)。
is_numeric()函数可以检测一个变量是否为数值。它接受一个参数,即要检查的变量,可以是一个整数、浮点数、甚至是一个数值字符串。如果变量是数值,则返回true;否则,返回false。
![](https://file.jishuzhan.net/article/1729384892833206274/5c10a02b68f4cad074c2e0307b18668c.webp)
intval(): 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。
字符串有可能返回 0,虽然取决于字符串最左侧的字符。
![](https://file.jishuzhan.net/article/1729384892833206274/004383cbb202a671fed1d92c3826fbba.webp)
![](https://file.jishuzhan.net/article/1729384892833206274/5a45f2d6145af5851cf2031b0cab4b56.webp)
==
当数字与字符串作比较时,系统会先将字符串转化为数字,再与数字进行比较。
数字和字符串进行比较时,当这个字符串是一个无法转换为数字的字符串,它就会被强制转化为数字,结果总是为0
依据上述理论,会出现四种情况
1.数字+字符(字符串)
![](https://file.jishuzhan.net/article/1729384892833206274/bb650eb135ba6f982172128ade09c96d.webp)
2.字符(字符串)+数字
![](https://file.jishuzhan.net/article/1729384892833206274/a41bd7f4b7385bbd89b0e806b97fb1c8.webp)
3.数字+字符(字符串)+数字
![](https://file.jishuzhan.net/article/1729384892833206274/4f19c2ec6a0f94346360da0af3b5954c.webp)
4.字符(字符串)+数字+字符(字符串)
![](https://file.jishuzhan.net/article/1729384892833206274/3823e189c525d98ca038e30f65952587.webp)
由以上实践可得出,a与b比较,b中含有数字和字符,截取到第一次出现字符,b中第一次出现字符前的数字与$a比较。
php
<?php
include_once "flag.php";
if(isset($_GET['key'])) {//从用户输入获取key
$key = $_GET['key'];//将获取的用户输入付给变量$key
if(!is_numeric($key)) {//判断$key是否是数值
exit("Just num!");//不是数值输出Just num!
}
$key = intval($key);//获取$key的整数值,再赋值给$key
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {//判断$key是否与$str相等
echo $flag;//相等输出flag
}
}
else {
echo "Try to find out source file!";用户没有输入,输出Try to find out source file!
}
//输入错误数值的情况未说明
所以,我们让key=123就可以输出flag
![](https://file.jishuzhan.net/article/1729384892833206274/9019f190a2d3bed117ae16e670218eb6.webp)
再验证一下刚刚代码分析的对不对
![](https://file.jishuzhan.net/article/1729384892833206274/a7be5cbc01ea8d91fff986e5893e0ba7.webp)