[BJDCTF2020]Mark loves cat foreach导致变量覆盖

news2024/11/25 9:50:56

这里我们着重了解一下变量覆盖

首先我们要知道函数是什么

foreach



foreach (iterable_expression as $value)
    statement
foreach (iterable_expression as $key => $value)
    statement

第一种格式遍历给定的 iterable_expression 迭代器。每次循环中,当前单元的值被赋给 $value。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。 

 不一样只是键名是否赋值

数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。

变量覆盖

这个其实很简单 就是有点绕

<?php
$ary=array('a','b','c','c','e');
foreach($ary as $key=>$value){     //$ary的键名赋给$key,键值赋给$value
	$$key=$value;    //把键值赋给$$key
}
print_r($key);      //输出4
因为 数组为5 那么就是有 01234个值 这里就会将 $ary的值存入 就是4
print_r($value);    //输出e
因为经过遍历 所以这里是指向最后一个值 就是 $arr[4]=e



print_r($$key);      //输出e
最后 $$key=$value

类似于
$(key)=value
所以输出$$key 就会输出 $(key) 就会输出 value =e

?>

已经感觉类似渗透了

直接dir扫一下

一下就想到git泄露

我们直接 githack

直接看看源代码

flag.php

index.php

这里存在echo 我们直接去看看网站哪里存在输出了

然后我们就可以确定现在输出的是$yds变量 我们开始代码审计

分析

1.输出是dog 那么就是$yds
只有在
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}
会输出yds 所以我们需要传递 POST GET参数

我们思考完这个 我们想想看如何可以让 flag输出

我们可以通过 exit()输出flag值

首先这里是输出yds

那么很简单

我们get的参数就是 yds


$$yds

但是输出的是 $yds

所以我们只需要让 $yds=$flag 

就可以变相exit($flag)了

$$yds=$$flag

就类似于

$(yds)=$(flag)

所以我们只需要传递 yds=flag即可

/?yds=flag

第二种

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

这里存在 post的值绝对为flag 或者 get的值绝对为flag

我们首先看post

flag=flag

$x=$flag=flag
这样就失去了变量 所以无法

接着我们看看get

flag=flag
$$flag=$flag=$flag

因为我们要输出is

所以

?is=flag

现在这里是 


$(is)=$(flag)

然后跟上 &flag=flag

这样的话

$(flag)=$(flag)

最后转换还是

$(is)=$(flag)

这样就可以输出了

这样就可以输出flag了

/?is=flag&flag=flag

第三种

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

get的flag值绝对为 $x 并且 $x不为 flag

        

我们还是确定我们需要输出 handsome

所以我们构造 ?handsome=flag

这样

$(handsome)=$(flag)

然后就会去看看$flag是啥 但是这里$不能为flag

我们在中间搭建一个桥梁即可

?handsome=flag&flag=b&b=flag

这样

$(handsom)=$(flag)
然后
$flag=$b
就绕过了!==判断

然后$(b)=flag

这里别的师傅有更简单的思路

?flag=a&&a!=flag

所以我们构造一个中间值传递参数即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

184_Python 在 Excel 和 Power BI 绘制堆积瀑布图

184_Python 在 Excel 和 Power BI 绘制堆积瀑布图 一、背景 在 2023 年 8 月 22 日 微软 Excel 官方宣布&#xff1a;在 Excel 原生内置的支持了 Python。博客原文 笔者第一时间就更新到了 Excel 的预览版&#xff0c;通过了漫长等待分发&#xff0c;现在可以体验了&#xf…

微信生态全场景方案

微信生态全场景方案 微信生态场景复杂&#xff0c;如何实现快速接入&#xff1f; 企业拥有跨平台数据&#xff0c;平台间数据割裂&#xff0c;如何实现各业务线数据整合&#xff1f; 借助身份云平台可快速接入微信生态全场景&#xff0c;轻松打通微信生态、电商平台、第三方平台…

prometheus 告警

prometheus 告警 1, prometheus 告警简介 告警能力在Prometheus的架构中被划分成两个独立的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。 在Prometheus中一…

基于Java建筑装修图纸管理平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

(高阶)Redis 7 第13讲 数据双写一致性 canal篇

面试题 问题答案如何保证mysql改动后,立即同步到Rediscanal 简介 https://github.com/alibaba/canal/wikihttps://github.com/alibaba/canal/wiki 基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 业务 数据库镜像数据库实时备份多级索引 (卖家和买家各自分库索引…

【springMvc】自定义注解的使用方式

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 1.前言 1.1.什么是注解 Annontation是Java5开始引入的新特征&#xff0c;中文名称叫注解。 它提供了一种安全…

【Java并发】聊聊死锁

什么是死锁 死锁出现的条件主要是资源互斥、占有并等待、非抢占、循环等待。 当出现两个线程对不同的资源进行获取的时候&#xff0c;A持有资源1&#xff0c;去获取资源2&#xff0c;B持有资源2&#xff0c;去获取资源1&#xff0c;就回出现死锁。 如何排查死锁 public cla…

计算机视觉与深度学习-经典网络解析-ResNet-[北邮鲁鹏]

这里写目录标题 ResNet参考产生背景贡献残差模块残差结构 批归一化ReLU激活函数的初始化方法 网络结构为什么残差网络性能好&#xff1f; ResNet ResNet&#xff08;Residual Neural Network&#xff09;是一种深度卷积神经网络模型&#xff0c;由Kaiming He等人在2015年提出。…

【1++的C++进阶】之智能指针

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;什么是智能指针二&#xff0c;为什么需要智能指针三&#xff0c;智能指针的发展 一&#xff0c;什么是智能指针 要了解智能指针&#xff0c;我们先要了解RA…

Linux上运行Redis服务出现报错及解决方法

近期&#xff0c;有用户反馈在Linux上运行Redis服务时遇到了一个报错&#xff1a;“Sorry, target machine refused connection”。下面我们来分析这个报错的解决方法。 一、报错分析 该报错通常是由于Redis服务无法与目标机器建立连接导致的。可能的原因包括以下几个方面&…

IP模块组装网络包及转发网络包链路

引言 之前协议栈系列的文章讲解了 连接&#xff0c;收发网络包&#xff0c;断开连接这些操作协议栈模块的处理&#xff0c;但是协议栈是上层 接下来会 委托ip模块进行真正的处理。 网络包 网络包的组成 网络包由头部的控制信息和头部后面的传输数据组成。 控制信息代表了包要…

TikTok矩阵玩法:如何最大程度地利用平台资源

在数字时代&#xff0c;TikTok已经成为全球范围内数亿用户的创意天堂&#xff0c;不仅仅是一个娱乐平台&#xff0c;还是一个创收的宝地。 TikTok矩阵玩法的崛起正在引领创作者们探索全新的变现方案&#xff0c;他们通过巧妙地利用平台资源&#xff0c;实现了前所未有的创收机…

为何网站一定要使用SSL证书

当您在浏览器中输入网址并按下回车键时&#xff0c;您是否曾想过您的个人信息和隐私是否会被窃取&#xff1f;在当今数字化的时代&#xff0c;网络安全问题越来越受到人们的关注。而SSL证书正是保护您的网站和用户信息安全的重要工具。 SSL证书是一种数字证书&#xff0c;它使用…

Unity之NetCode多人网络游戏联机对战教程(1)

文章目录 1.什么是NetCode2.安装NGO 1.什么是NetCode 官网链接&#xff1a;https://docs-multiplayer.unity3d.com/netcode/current/about/ Netcode for GameObjects&#xff08;NGO&#xff09;是专为Unity构建的高级网络库。它能够在网络会话中将GameObject和世界数据同时发…

unity打包后无法读取Excel解决方法

一、前言 最近几乎遇到了所有能遇到的unity读取Excel 的问题。 因为使用的是unity5.4&#xff0c;而且还是32位。所以出现各种问题在所难免。 废话不多说&#xff0c;现有的现象是&#xff1a;在unity的编辑器里可以完美运行&#xff0c;读取Excel不成问题&#xff0c;但是打包…

(JavaEE) 多线程基础3——多线程的代码案例 (单例模式, 阻塞队列,定时器)详解!!!

​​​​​​​ 目录 单例模式 什么是单例模式&#xff1f; —— “饿汉模式” —— “懒汉模式” ——懒汉模式-多线程版 ——懒汉模式-多线程版&#xff08;改进版&#xff09; 总结“懒汉模式”—— 多线程&#xff08;线程安全版&#xff09; 的要点 阻塞队列 什么…

[JAVAee]Spring项目的创建与基本使用

目录 Spring项目的创建 Spring中Bean对象的存储与获取 存储Bean对象 获取并使用Bean对象 getBean方法的重载 本文章介绍了Spring项目创建与使用的过程与一定的注意事项. Spring项目的创建 首先在IDEA中,新建一个Maven 第二步,在pom.xml中写入spring的依赖. pom.xml是mav…

l8-d21 域名解析与http服务器实现原理

一、域名解析gethostbyname函数 主机结构在 <netdb.h> 中定义如下&#xff1a; struct hostent { char *h_name; /* 官方域名 */ char **h_aliases; /* 别名*/ int h_addrtype; /* 地址族&#xff08;地址类型&#xff09; */ int h_l…

[JAVAee]SpringBoot配置文件

配置文件的介绍 配置文件当中记录了许多重要的配置信息,例如: 数据库的连接信息(用户的账户与密码)项目的启动端口第三方系统的调用密匙用于记录问题产生的日志 在spring框架中一些特定的框架会自动调用配置文件中的配置信息来运用. 配置文件中的属性也起到了类似全局变量的…

基于ROS环境的相机标定教程

一、参考资料 ROS学习——利用电脑相机标定 二、安装usb_cam驱动包 usb_cam - ROS Wiki GitHub - ros-drivers/usb_cam: A ROS Driver for V4L USB Cameras usb_cam包用于读取图像。 1. 源码安装usb_cam usb_cam用于实时SLAM&#xff0c;配合ROS平台使用。 1.1 下载usb_…