BUUCTF[BJDCTF2020]Mark loves cat 1
考点:
1:漏洞扫面工具的使用(dirsearch githack)
2:php代码审计
进入靶场:
发现所有的链接都是指向自己的
用dirsearch进行扫描
发现/.git泄露
用githack把内容下下来、
flag.php中的内容
<?php $flag = file_get_contents('/flag');
index.php中的内容
<?php include 'flag.php'; $yds = "dog"; $is = "cat"; $handsome = 'yds'; #foreach 遍历数组 #传入的post值会经过这,例:传入flag=flag,得到$x=flag,$y=flag,则$flag=flag;将会得不到flag的值 foreach($_POST as $x => $y){ $$x = $y; } #传入的get值会经过这。例:传入is=flag,得到$is=$flag. foreach($_GET as $x => $y){ $$x = $$y; } foreach($_GET as $x => $y){ #get传入flag变量且值不为flag if($_GET['flag'] === $x && $x !== 'flag'){ exit($handsome);#exit()函数输出一条消息,并退出当前脚本。 } } #get和post传参不能有flag if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); } #用post或get传的参数必须是flag且值为flag if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); } echo "the flag is: ".$flag;
第一种方法:
#传入的get值会经过这。例:传入is=flag,得到$is=$flag. foreach($_GET as $x => $y){ $$x = $$y; } #用post或get传的参数必须是flag且值为flag if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); }
首先传入is=flag,得到$x=is,$y=flag. 带进去变成$is=$flag;
if要求用post或get传入flag=flag,就会打印$is。而且经过foreach函数时得到$flag=$flag。没有改变内容。
即最终payload:/?is=flag&flag=flag
第二种方法:
#传入的get值会经过这。例:传入is=flag,得到$is=$flag. foreach($_GET as $x => $y){ $$x = $$y; } #get和post传参不能有flag if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); }
最终输出$yds,和第一种一样,先构造yds=flag,
if要求get和post不能有flag函数。直接忽略
即payload:/?yds=flag
用过了$yds和$is,来看看$handsome能不能用
foreach($_GET as $x => $y){ #git传入flag变量且值不为flag if($_GET['flag'] === $x && $x !== 'flag'){ exit($handsome);#exit()函数输出一条消息,并退出当前脚本。 } }
传入的变量必须为flag且值不能为flag。就相当于改变了flag的值,不能使用。
在网页代码中找到flag