变量覆盖漏洞 [BJDCTF2020]Mark loves cat 1

2023-12-24 05:01

本文主要是介绍变量覆盖漏洞 [BJDCTF2020]Mark loves cat 1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

打开题目

我们拿dirsearch扫描一下看看

扫描得到

看见有git字眼,那我们就访问

用githack去扒一下源代码看看

可以看到确实有flag.php结合index.php存在

但是当我去翻源代码的时候却没有翻到

去网上找到了这道题目的源代码

<?phpinclude 'flag.php';$yds = "dog";
$is = "cat";
$handsome = 'yds';foreach($_POST as $x => $y){    $$x = $y  ;  //post 声明至当前文件
}foreach($_GET as $x => $y){    $$x = $$y;  //GET型变量重新赋值为当前文件变量中以其值为键名的值
}foreach($_GET as $x => $y){if($_GET['flag'] === $x && $x !== 'flag'){  //传入的变量为flag   value不是flagexit($handsome);}
}if(!isset($_GET['flag']) && !isset($_POST['flag'])){  exit($yds);
}if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){   exit($is);
}echo "the flag is: ".$flag;
}

我们用seay代码审计一下看看可能存在哪些漏洞

可以看到网页的源代码双$$符号可能存在变量覆盖漏洞

现在我们来逐一看看源代码分析语句

include 'flag.php';

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

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

首先,包含了一个flag.php文件,将dog值和cat值分别赋给yds和is,字符串 'yds' 赋值给 $handsome 变量,foreach($_POST as $x => $y) 的作用是遍历 $_POST 数组,对于每一个键值对,将键赋值给变量 $x,将值赋值给变量 $y。$$x = $y; 是一个动态变量赋值语法

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

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

其次,foreach的作用是遍历$_GET数组,将键值赋值给变量$x,将值赋值给变量 $y。$$x = $y; 是一个动态变量赋值语法。这个方式可以创建和覆盖变量。

然后再用foreach遍历$_GET数组,在其后跟了一个if语句,它检查是否当前迭代的键 $x 的值等于 $_GET['flag'] 的值,并且 $x 不等于字符串 'flag',如果条件成立,就会执行下面的代码块,exit($handsome);如果条件成立,exit($handsome); 会立即终止脚本的执行,并输出变量 $handsome 的值。

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

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){   
    exit($is);
}

echo "the flag is: ".$flag;
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); }:这是一个条件语句。它首先检查是否 'flag' 参数既不在 $_GET 中,也不在 $_POST 中。isset 函数用于检查变量是否已设置并且不为 null。如果条件成立,即 'flag' 参数既不在 GET 请求中,也不在 POST 请求中,那么脚本会立即退出,并输出 $yds 变量的值。

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); }:这是另一个条件语句。它检查是否 'flag' 参数的值在 POST 请求中等于字符串 'flag',或者在 GET 请求中等于字符串 'flag'。如果条件成立,脚本会退出并输出 $is 变量的值。

echo "the flag is: ".$flag;:这段代码在前两个条件都不成立的情况下执行,输出一个字符串 "the flag is: " 以及变量 $flag 的值。

解法1  exit($handsome);

关键代码

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

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

进入条件,我们先get传入?flag=a&a=flag,所以x=flag,y=a,$flag=$a;             x=a,y=flag,$a=$flag

然后经过foreach函数时,函数判断到 a=flag 的时候, $_GET['flag'] === $x && $x !== 'flag' --> a === a && a !== 'flag' 这就进来了 true && true 就进来了, 然后 exit($handsome);

payload为:

get传参    /?yds=flag

getc传参  /?is=flag&flag=flag

查看页面源代码得到flag

参考wp:

https://www.cnblogs.com/Nestar/p/15922456.html

知识点:

  • forEach

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。forEach(): 没有返回值,本质上等同于 for 循环,forEach 是不改变原数组

注意: forEach() 对于空数组是不会执行回调函数的

  • foreach和for循环语句既有相似点也有不同点

详情见:for循环和forEach的区别,看着一篇就够了! - 知乎

首先 for循环的执行 只能是通过循环生成索引下标数值 然后通过索引下标 操作 数组的数据元素

但是 forEach 可以通过设定参数 来 存储 索引下标 数据数值 这样在操作上更加的便利

 例如:

foreach($_POST as $x => $y)

作用是遍历 $_POST 数组,对于每一个键值对,将键赋值给变量 $x,将值赋值给变量 $y

如果 $_POST 包含如下数据

$_POST = array('username' => 'john_doe','password' => 'secure_password',// other form fields...
);

foreach($_POST as $x => $y) 循环中,第一次迭代时,$x 将被赋值为 'username'$y 将被赋值为 'john_doe';第二次迭代时,$x 将被赋值为 'password'$y 将被赋值为 'secure_password',依此类推

同样

如果语句变成了

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

例如,如果 $_POST 包含以下数据

$_POST = array('username' => 'john_doe','password' => 'secure_password',// other form fields...
);

foreach 循环中,第一次迭代时,$x 将被赋值为 'username'$y 将被赋值为 'john_doe'。接着,$$x = $y; 将会执行,它实际上等同于 $username = 'john_doe';。换句话说,它创建了一个名为 $username 的变量,并将 'john_doe' 赋给它。

同理,第二次迭代时,$x 被赋值为 'password'$y 被赋值为 'secure_password',所以 $$x = $y; 将执行 $password = 'secure_password';,创建了一个名为 $password 的变量并将 'secure_password' 赋给它。

这种方式可以创建和覆盖变量。

这篇关于变量覆盖漏洞 [BJDCTF2020]Mark loves cat 1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/530617

相关文章

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

POJ3041 最小顶点覆盖

N*N的矩阵,有些格子有物体,每次消除一行或一列,最少要几次消灭完。 行i - >列j 连边,表示(i,j)处有物体,即 边表示 物体。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impo

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量,那么运行时会报uncaught ReferenceError: *** is not de

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a = 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量,也可以直接手动写入函数(注意写入格式。) 这样点击按钮时就直接展示刚刚设置的全局变量3了。 2、更改变量值 在新建交互里点击设置变量值。 将a变量设置成等于10. 将新

shell脚本中变量中字符串替换的测试 /和//的区别

test_char=abbbcbbbf echo "bf:test_char = " $test_char test_char=${test_char/bbb/ddd} echo "af:test_char = " $test_char 输出: bf:test_char =  abbbcbbbf af:test_char =  adddcbbbf 只匹配第一个

eclipse中相同变量显示变色设置

java文件的设置"Window"-"preferences"-"Java"-"Editor"-"Mark Occurrences"复选框勾选 js文件的设  置"Window"-"preferences"-"web"-"javascript"-"Mark Occurrences"复选框勾选 。

Python学习1--变量和简单数据

经过这一段时间的学习,将Python相关的知识点记录下来,好记性不如烂笔头嘛。 本文主要参考了《Python编程从入门到实践》以及唐宇迪老师的教程《Python快速入门视频课程》,然后在博主http://www.cnblogs.com/liubinsh/p/6937409.html的基础上总结而成,特此感谢! 第二章 变量和简单数据类型 什么是变量 这里的message就是变量,