当前位置: 首页 > news >正文

ctf Mark loves cat (超详细记录)

分析:首先根据问题名称看不出明显的考点方向,先看了一下源代码,没有flag相关内容

我后面就去尝试sql注入方向,但是试了几个参数发现得到的回显都是一致的,全是主页,显然是做了错误重定向,那我就怀疑这里不是sql注入了

也没有发现隐藏的接口

然后简单拼接一下index.php,探测出是一个php站点

然后做一下目录扫描

先用御剑扫了一下,扫到不少200的,但是他这里做了错误重定向,扫出来的那些去访问还是主页

使用dirserach 单独扫描php后缀没结果,全量扫描才扫描出了一个git目录,所以本题应该是git源码泄露相关

往后就比较有意思了,用githack把对应的泄露git路径的源码pull下来,之后就是代码审计。

Tips:这个githack下载之后还是需要做一些配置的,建议百度一下

扫描之后会生成对应域名的文件夹,里面是pull的源码

代码的问题是变量覆盖

这里最难的语法点是$$符号的含义,明白了这个就能解决问题了,这也是变量覆盖的原因

在PHP中,$$x = $y; 这种语法结构使用了两个美元符号($$),这被称为可变变量(variable variables)。它允许你将一个变量的值作为另一个变量的名称。

具体来说,$$x = $y; 这行代码做了以下几件事:

  1. 首先,它解析了变量$x的值。假设$x的值是字符串"foo",那么$$x就等价于$foo
  2. 然后,它将$y的值赋给这个由$x的值确定的变量名(在这个例子中是$foo)。换句话说,如果$y的值是"bar",那么执行这行代码后,$foo的值就会是"bar"

看到这你就明白了,问题就出在这里,两个$符号会导致用户传递的参数会变为一个新的变量,也就是用户可以决定服务端创建的参数名称,那么我就可以去构造一个服务端已有的参数从而造成变量覆盖。

这题变量覆盖的方法有好几种,我来解释个简单的

要想输出flag,可以通过get方法提交参数,只要不满足条件的if条件,不exit退出,即可输出flag,所以就是要绕过条件判断,

或者exit退出,在退出之前输出flag,也就是想办法让exit里面的参数变成$flag即可

分析思路图如下:

poc: ?yds=flag

拿到flag

flag{9810ce7c-c9e8-4dbe-90e2-de8f241ef3f9}


http://www.mrgr.cn/news/23271.html

相关文章:

  • python日常刷题(二)
  • PI电动位移平台简明教程
  • [项目][WebServer][项目介绍及知识铺垫][下]详细讲解
  • 【C语言】揭开计数制的面纱:深入浅出二进制及二进制计算
  • 4G基站和5G基站的覆盖范围对比
  • 华为 HCIP-Datacom H12-821 题库 (10)
  • 存储课程学习笔记4_设计数据结构管理nvme磁盘(基于已经通过struct nvme_user_io和ioctl实现了对nvme设备的读写)
  • [git操作] git创建仓库上传github报错
  • 大模型→世界模型下的「认知流形」本质·上
  • Apple Vision Pro:重塑工作与娱乐体验的14天深度体验报告
  • K-均值聚类算法及其优缺点
  • HarmonyOs 应用基础--ArkTS-核心-基础
  • 【信创】统信UOS1070根目录占满后无法进入系统的解决方法
  • 基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统
  • C#笔记8 线程是什么?多线程怎么实现和操作?
  • 《深度学习》【项目】OpenCV 信用卡号识别
  • 数据库设计【从概念到实施】
  • MVC设计模式与delegate
  • 2024-09-09 Leetcode刷题
  • Parsec无法使用、访问、连接、被墙、被封、800报错解决方案 完美平替软件