变量覆盖漏洞 [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

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的

变量与命名

引言         在前两个课时中,我们已经了解了 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