[BJDCTF2020]Mark loves cat (两种解法)(变量覆盖漏洞)


[BJDCTF2020]Mark loves cat (两种解法)(变量覆盖漏洞)

这几天被学生机折磨死了,第一次用好多不熟练,刷个题压压惊。

1.拿到网站,发现所有的超链接都是指向自己的:(两种答案都在最后)
在这里插入图片描述
2.扫描目录找到 .git 泄露:
(做ctf题要习惯用dirsearch,而且要调低线程):
dirsearch.py -u url -e * --timeout=2 -t 1 -x 400,403,404,500,503,429

3.用lijiejie 的githack把代码下下来,(github上找),然后审计一下:
在这里插入图片描述
4.发现就两个重要文件,flag.php,读取flag文件内容并赋值给$flag:
在这里插入图片描述
5.index.php,开头有个包含,在最后有个输出flag:(实际上到不了这一步- -可恶)
在这里插入图片描述

在这里插入图片描述
6.我给全文做了个注释:
在这里插入图片描述
7.可以很明显的看到,代码中有变量覆盖漏洞:
在这里插入图片描述
8.这个题我是没找到 绕过判断不提前结束 ,而又不改变flag值的情况下到达最后的echo。但是别忘了 “exit” 也是一种输出啊!这里虽然输出的不是$flag变量,但是我们有变量覆盖漏洞啊!

在这里插入图片描述
9.尝试第一个exit处,看我们的注释,键名不能有flag,而且又要键名为flag的键值等于其中一个键名,你又要我不存在,又要我存在,进不去这个判断,告辞:
在这里插入图片描述
10.第二个判断处,看注释,在这里插入图片描述
我们想要通过单纯的post参数搞定它是不可能的,因为post处的变量覆盖是让它变成我们可控的值,所以搞不定。
在这里插入图片描述
我们可以通过单纯的get或者get+post搞定,既然可以只用get,get+post我就不分析了,套娃。

可以看到这里是输出的$yds变量,那么我们就要通过变量覆盖达到$yds=$flag的效果,直接说答案比较好分析:get传参 yds=flag;
我们看看参数的传递流程:

在这里插入图片描述
在这个里面,首先是 $x=yds,$=flag 。把它带进foreach里面,就变成了$yds=$flag 。$$x就相当于是$($x),这样就非常好理解变量覆盖漏洞了。
这是其中一个答案。
在这里插入图片描述
11.下面还有输出的语句,我打算继续找更多的解题方法。

这里是利用了exit($is)。

我们首先看看,要进入判断,执行exit($is)需要的条件,看注释。

在这里插入图片描述
那我们就先从post型flag=flag开始:

我们post的数据,会在这一步,把原来的$flag的值改变,因为$x=flag,$y=flag,然后带进去变成了$flag=flag。over,原来的flag值被我们整没了,这条路不通:
在这里插入图片描述
我们试试get型的flag=flag:
(这里我成功了,把答案拿出来先:is=flag&flag=flag)

首先分析变量覆盖处:
在这里插入图片描述
首先是$x=is,$y=flag,带进去就变成了$is=$flag;
现在到了第二个参数,$x=flag,$y=flag,带进去变成$flag=$flag,自己变成自己,没啥影响,没有改变flag 的值,成功。(flag不一样是因为靶机中途掉了- -)
在这里插入图片描述

第一种,get传参:yds=flag

第二种,get传参:is=flag&flag=flag

找到了wp之外的答案,奖励自己再看几章小说,hhh。