[BJDCTF2020]Mark loves cat
首先打开网站看到的是一个个人博客,这种常规的 类似实战题目 先扫描目录看看
路径扫描
没错这真的是我的字典,就7个路径,哈哈哈,还在收集啊
git泄露
看到了一个 .git 泄露
用了俩工具测试,无任何有用信息,工具名称在图片里:GitHack
、Git_Extract
这俩工具 一个获取文件,一个获取 .git 文件, 哈哈哈,今天才发现,我是真的菜
flag.php 是存在的 ,不过只能确定 /flag 在哪里
429 Too Many Requests
烦死了,没法用现成的工具扫路径
python .\dirsearch.py -e * -u http://f3398cf1-ffb4-443e-a439-a264a65e4d5d.node4.buuoj.cn:81/ -t 1 --timeout=2 -x 400,403,404,500,503,429
果然看大佬的文章才能学到知识啊, 我自己设置了 -t 1
但是没啥用,还是报429
,看看人家大佬设置 --timeout=2
就可以了,真强
人傻了,那个index.php 后面是有代码的
然后分析分析代码:
<?phpinclude 'flag.php';
print_r($flag);$yds = "dog";
$is = "cat";
$handsome = 'yds';foreach($_POST as $x => $y){ // $键 = $值的值$$x = $y; }foreach($_GET as $x => $y){$$x = $$y;// $handsome = flag的值 ---> $handsome = $flag --> $x=handsome & $y=flag
}// 需要不满足以下几个条件
foreach($_GET as $x => $y){if($_GET['flag'] === $x && $x !== 'flag'){ //不能同时 flag的值等于某个键名,那个键值又是flagexit($handsome);}
}if(!isset($_GET['flag']) && !isset($_POST['flag'])){// 不能同时 GET 和 POST 都没设置 flagexit($yds);
}if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){// 任意都不能满足 flag === 'flag'exit($is);
}echo "the flag is: ".$flag;
这个东西真的是需要自己去慢慢看的,慢慢看才能学到东西,主要涉及的就是可变变量
经过大佬的点拨,我悟了
这个题我是没找到 绕过判断不提前结束 ,而又不改变flag值的情况下到达最后的echo。但是别忘了 “exit” 也是一种输出啊!这里虽然输出的不是$flag变量,但是我们有变量覆盖漏洞啊!
[BJDCTF2020]Mark loves cat (两种解法)(变量覆盖漏洞)_H9_dawn的博客-CSDN博客
那么情况就很明确了,污染 exit 语句的参数 , 不过后来证明,大佬说的是不对的,哈哈哈。
解法1:exit($handsome);
首先进入条件:
if($_GET['flag'] === $x && $x !== 'flag'){ //不能同时 flag的值等于某个键名,那个键名又是flag, 就是 flag=a && a!=flag啊,这样就能进了 ?flag=(不是flag)&(不是flag)=xxx
进入条件十分简单:?flag=a&a=flag
即可
函数判断到 a=flag
的时候, $_GET['flag'] === $x && $x !== 'flag'
--> a === a && a !== 'flag'
这就进来了 true && true
就进来了, 然后 `exit($handsome);
因为要 `exit($handsome);
` 那么我们要做的就是 让` $handsome = $flag
get` 条件的处理如下:
foreach($_GET as $x => $y){$$x = $$y;// $handsome = flag的值 ---> $handsome = $flag --> $x=handsome & $y=flag
}
`$$x = $$y
`而我们要的结果是`$handsome = $flag
`那么特简单 让 `$x=handsome 和 $y=flag
`即可
payload1:http://127.0.0.1/CTF/?handsome=flag&flag=b&b=flag
payload2:http://127.0.0.1/CTF/?handsome=flag&flag=handsome(看师傅们的评论看到的)
解法2:exit($yds);
想要进入这个 exit
语句的话,先来看看条件
if(!isset($_GET['flag']) && !isset($_POST['flag'])){// 不能同时 GET 和 POST都没设置 flag
哦,GET,POST 都不设置flag就进去了啊
payload:http://127.0.0.1/CTF/?yds=flag
好简单,这题目
解法3:exit($is);
这个也比较简单:
进入条件: if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){// 任意都不能满足 flag === 'flag'
让 flag=flag
payload: http://f3398cf1-ffb4-443e-a439-a264a65e4d5d.node4.buuoj.cn:81?is=flag&flag=flag
解法4:echo "the flag is: ".$flag;
强类型比较绕过
我在尝试的时候发现有个问题:
- 正常情况
http://127.0.0.1/CTF/?a=flag&flag=a
这里触发了if($_GET['flag'] === $x && $x !== 'flag'){ //不能同时 $_GET['flag'] 的值等于某个键名,那个键名又不是flag
这个条件,进入了exit($handsome);
里面了,这很好理解的。函数遍历a=flag
的时候,$_GET['flag'] === $x && $x !== 'flag'
-->a === a && a !== 'flag'
这就进来了true && true
就进来了, 然后exit($handsome);
2.不正常的情况
http://127.0.0.1/CTF/?1=flag&flag=1
这是啥情况呢,按道理来说跟上面一样啊,这里触发了 if($_GET['flag'] === $x && $x !== 'flag'){ //不能同时 $_GET['flag'] 的值等于某个键名,那个键名又不是flag
这个条件,进入了 exit($handsome);
里面了,这很好理解的。函数遍历 1=flag
的时候, $_GET['flag'] === $x && $x !== 'flag'
--> 1 === 1 && 1 !== 'flag'
这就进来了 true && true
就进来了, 然后 exit($handsome);
但是事实不是这样的,我估计是涉及到 字符串和数字的问题,都打印出来看看。
打印代码:
foreach($_GET as $x => $y){echo "</br>foreach :".'</br>';echo '$_GET[\'flag\'] :';var_dump($_GET['flag']).'</br>';echo '$x :';var_dump($x).'</br>';echo '$_GET[\'flag\'] === $x :';var_dump($_GET['flag'] === $x).'</br>';echo '$x !== \'flag\' :';var_dump($x !== 'flag').'</br>';if($_GET['flag'] === $x && $x !== 'flag'){ //不能同时 1 === 1 && 1 !== 'flag' flag的值等于某个键名,键名又不是flagexit($handsome);}
}
果然啊,get
传参数的时候,如果传入1
,默认:做为键:类型是 int
; 做为值,类型是 string
问题就这这里了:$_GET['flag'] === $x
: 如果传入 a=flag&flag=a
那么 判断 a=flag
的时候 $_GET['flag']
是 a
, &x
是 a
,完全相等 进入if条件, 而如果传入 1=flag&flag=1
那么判断 1=flag
的时候 $_GET['flag']
是 (string)1
,&x
是 (int)1
不完全相等,无法进入if条件,进而绕过
这样就绕过好了,满足了大佬说的几句话,不会改变 flag 而且不会提前结束,具体其他几个循环自己打印看看就行。
这个题我是没找到 绕过判断不提前结束 ,而又不改变flag值的情况下到达最后的echo。
还有一个可能的解法(没试,不知道),传入 $$$xx=$$xx
,或者 更多的 $$$$$$$x=$xx
, 来绕过 变量覆盖,这里记一下,变量覆盖可以多次递归(没实验过)
[BJDCTF2020]Mark loves cat相关推荐
- [BJDCTF2020]Mark loves cat 1
[BJDCTF2020]Mark loves cat 1 首先打开题目得到: 在网站没有什么发现 就扫描一下网站得到: 发现有git泄露得到: python2 GitHack.py http://d9 ...
- [BJDCTF2020]Mark loves cat 1——(超详细 三种方法)
[BJDCTF2020]Mark loves cat 1 一进入环境,毫无头绪 拿御剑 或者 dirsearch 扫出了 .git/ 可以猜出,本关一定与git源码泄露有关 我们使用GitHack 看 ...
- [BJDCTF2020]Mark loves cat(3种解法)
练习靶场:BUUCTF 题目搜索:[BJDCTF2020]Mark loves cat 靶机启动后的界面 步骤1:我们使用工具dirsearch扫描目录,观察是否有信息泄露 python dirs ...
- [BJDCTF2020]Mark loves cat详细解法与思路
前言 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途! 知识点: 主要考点是$$会导致变量覆盖 题目 ...
- [BJDCTF2020]Mark loves cat(.git源码泄露与代码审计之变量覆盖漏洞)
知识点: php中$$用来定义可变变量 解题: python GitHack.py http://e6e2adea-991f-4ae7-b4ea-0f82d49d8f8c.node3.buuoj.cn ...
- BUUCTF [BJDCTF2020]Mark loves cat
打开题目 搜索一番没有任何发现: dirsearch扫描后发现.git泄露,GitHack.py下载源码: python GitHack.py http://b77333f7-af9a-4f4a-aa ...
- buuctf Mark loves cat
buuctf Mark loves cat 打开是个静态页面,源码也无任何有用信息 dirsearch扫描后发现.git泄露 GitHack.py下载得到两个php文件,接下来就是代码审计: flag ...
- web buuctf [BJDCTF2020]Mark loves cat1
考点: 1.git泄露 2.变量覆盖 1.打开靶机,先看robots.txt,并用dirsearch进行扫描 py dirsearch.py -u f190ddaf-3db0-48c2-a858-4a ...
- Mark loves cat
扫描目录(但是我用御剑扫不出来) ,然后用.git下载文件 <?phpinclude 'flag.php';$yds = "dog"; $is = "cat&quo ...
最新文章
- 兼容Silverlight4的实用的Silverlight可拖放工具类源代码
- 推荐8个年薪100万BAT级优质技术大号
- 如何从机器学习数据中获取更多收益
- 前端实习生笔试_一道来自美图的实习生前端笔试算法题
- 004_CSS元素选择器
- python 编译器重构_Python之父考虑重构Python解释器
- 科大星云诗社动态20210210
- ubuntu10.10编译qtopia-2.2.0 问题总结及分析
- java微妙_编码Java时的10个微妙的最佳实践
- leetcode1437. 是否所有 1 都至少相隔 k 个元素
- (转载)Linux僵死进程的产生与避免
- (一)apache atlas源代码编译与打包
- [转]Linux启动界面切换:图形界面-字符界面
- Python:bs4的使用
- 任务调度:分布式调度引擎-DAGScheduleX简介
- Labview编程模式
- 数据结构队列的代码实现
- 快速由WP8升级到WP8.1
- mysql增删查改------插入与查询数据
- python3 解压7z文件
热门文章
- 视频测试软件+视频测试硬件=视频质量测试解决方法+视频测试的重要性
- 推荐一款美观的开源社区系统
- 2022/03/03js作业第一个不同宽度变色第二个是输入几年几月几日判断是今年的第几天(不算闰年2月为28日)
- 一个月刷完机器学习笔试题300题(10)
- 流量偷跑,运营商该不该赔偿?
- Hexo 博客导流微信公众号
- 【有利可图网】PS保存图片提示“无法完成请求”,教你4种解决方法!
- APP云测试平台分享
- PS 移动工具和复制
- 系统架构师—软件架构设计(二)CS/BS/SOA/DSSA/ABSD