题目环境:
好好好,让找源文件是吧?咱们二话不说直接扫它后台
使用dirsearch工具扫描网站后台(博主有这个工具的压缩包,可以私聊我领取)python dirsearch.py -u http://0d418151-ebaf-4f26-86b2-5363ed16530f.node4.buuoj.cn:81/
探测存活文件
不要一惊一乍哦,0B内存这是假的flag.php文件
探测出存活文件index.php.bak
bak文件后缀是备份文件
下载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!";
}
PHP代码审计
包含flag.php文件
通过GET方式传参的参数key
_is_numeric()函数_用于检测变量是否为数字或数字字符串,那么加上感叹号就是如果不是数字或数字字符串就输出Just num!并退出
intval() 函数用于获取变量的整数值
if语句如果key变量与str变量相等则返回TRUE并输出flag
else语句如果以上条件全部都不符合条件,则输出Try to find out source file!
进一步分析
看完代码审计是不是很慌,我猜你已经注意到了“key变量和str变量的值是不可能相等的!”
哪怎么搞呢?
别急,作者还给了我们一个惊喜!
“==”PHP弱比较逻辑运算符
PHP弱比较呢只是要求运算符两边的数据类型必须一致并没有要求两个变量的值一定要相等
str变量是字符串,同时要求key变量必须是数字,并且str字符串里面存在123,所以key=123即可获得flag
构造payload:?key=123
上传payload:
得到flag:flag{b7a1c0e0-3a3a-4267-999d-ad788f286d41}