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

打开题目

我们拿dirsearch扫描一下看看

扫描得到

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

用githack去扒一下源代码看看

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

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

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

<?php

include '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不是flag
        exit($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' 赋给它。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第二十二章 : Spring Boot 集成定时任务(一)

第二十二章 &#xff1a; Spring Boot 集成定时任务&#xff08;一&#xff09; 前言 本章知识点&#xff1a; 介绍使用Spring Boot内置的Scheduled注解来实现定时任务-单线程和多线程&#xff1b;以及介绍Quartz定时任务调度框架&#xff1a;简单定时调度器&#xff08;Simp…

【EI会议征稿通知】2024年计算机与多媒体技术国际学术会议(ICCMT 2024)

2024年计算机与多媒体技术国际学术会议&#xff08;ICCMT 2024&#xff09; 2024 International Conference on Computer and Multimedia Technology (ICCMT 2024) 2024年计算机与多媒体技术国际学术会议&#xff08;ICCMT2024&#xff09;将于3月1日-3日在福建三明举办。会议…

Atium Designer 23 全新功能-丝印制备,解决DFM问题

进行PCB设计时需要养成良好的设计习惯&#xff0c;才能保证后期的生产效果。例如整板上需要保证丝印跟阻焊的间距规则避免产生丝印重叠造成的PCB制造设计&#xff08;DFM&#xff09;问题。丝印重叠阻焊的影响有如下&#xff1a; 1&#xff09;PCB板后期打样&#xff0c;一般是…

基础题总结(三)

一.0的个数 代码如下 二.序列求和

解决苹果应用商城审核拒绝的Guideline 2.5.4 - Performance - Software Requirements问题

当您的应用程序在苹果应用商城审核过程中被拒绝时&#xff0c;苹果会向您发送一封邮件&#xff0c;其中提供了关于拒绝原因的详细信息。本文将深入探讨如何正确处理Guideline 2.5.4 - Performance - Software Requirements问题&#xff0c;并提供解决方案&#xff0c;以确保您的…

gitee的学习

1.git下载 下载地址&#xff1a;https://git-scm.com/ 2.建立远程仓库 访问&#xff1a;gitee.com 在此网站上创建 3.本地操作 在本地找一个任意文件&#xff0c;克隆git 执行命令&#xff1a;git clone https://gitee.com/beijing-jiaxin-times_0/test_zsx_cang_ku.git …

tcp vegas 为什么好

我吹捧 bbr 时曾论证过它在和 buffer 拧巴的时候表现如何优秀&#xff0c;但这一次说 vegas 时&#xff0c;我说的是从拥塞控制这个问题本身看来&#xff0c;vegas 为什么好&#xff0c;并且正确。 接着昨天 tcp vegas 鉴赏 继续扯。 假设一群共享带宽的流量中有流量退出或有…

版本控制器git

1、下载 官网下载地址&#xff1a;https://git-scm.com/download 如果觉得官网下载慢的话&#xff0c;可以考虑某些应用市场&#xff0c;比如腾讯的 2、安装 安装就没什么可说的了&#xff0c;一直下一步就行了。 安装完毕后&#xff0c;回到桌面右键&#xff0c;如果出现这…

GLTF vs FBX:应该使用哪种格式?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 概括地说&#xff0c;如果要将数据传输到 Unity 或虚幻引擎等游戏引擎…

用VS Code修改源代码的编码格式

用VS Code打开一个编码格式为GB2312的源代码文件&#xff0c;中文部分显示为乱码 这是因为VS Code默认解码格式为UTF-8 此时我们点击上面红框这个位置&#xff0c;命令面板弹出两个选项&#xff0c;选择通过编码重新打开 可以看到VS Code已经猜测出该文件就是GB 2312编码的…

DDPM推导笔记

各位佬看文章之前&#xff0c;可以先去看看这个视频&#xff0c;并给这位up主点赞投币&#xff0c;这位佬讲解的太好了&#xff1a;大白话AI 1.前置知识的学习 1.1 正态分布特性 ​ &#xff08;1&#xff09;正态分布的概率密度函数 f ( x ) 1 2 π σ e − ( x − μ ) …

机器学习 | 集成学习

团结就是力量&#xff01; Ensemble Learning 兼听则明&#xff0c;偏信则暗。 集成学习既是一种思想也是一类算法&#xff0c;它是建立在其他机器学习的算法之上&#xff0c;研究怎么让不同的算法之间进行协同。 既可以监督学习&#xff0c;也可以无监督学习。 集成学习用机器…

本地运行vue脚手架 从下载node开始到创建vue

vue2node 1.安装node vue2版本我node一般使用的是14版本左右 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f886442c20114e62aef8113425e34ad2.pngnode官网 假如我node版本过低 你就找到控制面板 找到node卸载掉 我一般下载两个版本 安装vue cli vuecl…

element下拉框背景/选中/鼠标移入样式设置

问题在页面内写穿透无效 <style lang"scss" scoped> // 这个有效::v-deep .el-input--mini .el-input__inner {background: transparent;color: #fff;border: 1px solid #093B9E;} </style>直接在标签内写 <style> .el-select-dropdown__list {b…

【uniapp】uniapp中本地存储sqlite数据库保姆级使用教程(附完整代码和注释)

数据库请求接口封装 uniapp中提供了plus.sqlite接口&#xff0c;在这里我们对常用的数据库请求操作进行了二次封装 这里的dbName、dbPath、recordsTable 可以根据你的需求自己命名 module.exports {/** * type {String} 数据库名称*/dbName: salary,/*** 数据库地址* type {…

3842充电器电路图大全

3842充电器电路图&#xff08;一&#xff09; UC3842组成的充电器电路 图1中C1、V1&#xff5e;V4、C2组成滤波整流电路&#xff0c;变压器T为高频变压器&#xff0c;V5、R2、C11组成功率开关管V7的保护电路&#xff0c;NF为供给IC电源的绕组。单端输出IC为UC3842&#xff0c;…

在Linux安装的Docker中开启IPv6

先在Linux中安装docker&#xff0c;然后在docker中开启IPv6。 安装docker 第一步&#xff0c;卸载旧版本docker。 若系统中已安装旧版本docker&#xff0c;则需要卸载旧版本docker以及与旧版本docker相关的依赖项。 命令&#xff1a;yum -y remove docker docker-client do…

Sirius:一款功能强大的通用漏洞扫描工具

关于Sirius Sirius是一款功能强大的通用漏洞扫描工具&#xff0c;该工具可以帮助广大研究人员在大多数场景下识别和验证应用程序中存在的安全漏洞。 现如今&#xff0c;信息安全社区仍然是收集网络安全情报数据最佳且最有利的来源&#xff0c;而且社区本身的表现经常会优于商…

SparkSQL的编程模型(DataFrame和DataSet)

1.2 SparkSQL的编程模型(DataFrame和DataSet) 1.2.1 编程模型简介 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 SQL SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的时候&#xff0c;SQL操作的是…

C#联合halcon开发,连接相机颜色不对,无法连接相机

相机可以在海康软件MVS中打开&#xff08;颜色正常&#xff09;&#xff0c;但是在C#开发的程式中无法打开&#xff08;彩色相机颜色显示异常&#xff09;。 1.异常处理 1.查看相机和MVS软件是否连接成功&#xff1b; 2.如果成功&#xff0c;连接C#程序&#xff1b; 3.程序连接…