29_反序列化漏洞、反序列化概念、反序列化原理、反序列化漏洞防御、序列化

news2024/11/16 2:34:03

概念

 

序列化和反序列化

序列化

  • 将对象型转换成字符串的过程。

反序列化

  • 将字符串还原成对象型的过程。

反序列化漏洞(了解)

  • 便于传输和存储

 接下来上代码进行测试,先搞个类,

<?php
    header("content-type:text/html;charset=utf8");

    // 序列化  反序列化

    // 创建一个类
    class Person{
        // 属性
        var $name ;
        var $age ;
        // 方法
        function hello(){
            echo "你好";
        }
        // 构造方法
        function __construct($n,$a){
            $this->name = $n;
            $this->age = $a;
        }
    }

    // 实例化一个对象
    $p1 = new Person("zhangsan",18);
    var_dump($p1);
    echo "<br>";

    // 将 对象 序列化成 字符串
    $res = serialize($p1);
    echo $res; // O:6:"Person":2:{s:4:"name";s:8:"zhangsan";s:3:"age";i:18;}
    echo "<br>";

    // 把字符串 反序列化为 对象
    $p11 = unserialize($res);
    var_dump($p11);
    echo "<br>-------------------<br>";

    // 自定义字符串,进行反序列化
    $str1 = 'O:6:"Person":2:{s:4:"name";s:8:"zhangsan";s:3:"age";i:18;}';
    $p2 = unserialize($str1);
    var_dump($p2);

    echo "<br>-------------------<br>";
    $str3 = 'O:6:"Person":2:{s:4:"name";s:4:"lisi";s:3:"age";i:18;}';
    $p3 = unserialize($str3);
    var_dump($p3);

    echo "<br>-------------------<br>";
    $str4 = 'O:6:"Person":3:{s:4:"name";s:4:"lisi";s:3:"age";i:18;s:4:"abcd";s:4:"1234";}';
    $p4 = unserialize($str4);
    var_dump($p4);

?>

 解析:

O:6:"Person":1:{s:4:"name";s:6:"张三";}
// O:object
// 6:类名的长度
// "Person"  :类名
// 1:属性的个数
// s:string类型

 

<?php
    class S{
        // 属性
        var $test = "<script>alert(1);</script>";
        }
	echo(serialize(new S()));
?>

测试后反序列化成功,那么可想到这个界面是否跟XSS有关,试着往里插一下弹框("<script>alert(1);</script>")的数据看看,嫌麻烦用工具可以去菜鸟工具的在线php的序列化输出一下弹框("<script>alert(1);</script>")的字符串格式是怎样的,如下图右,已输出。手敲也行,得数,麻烦

这是反序列化结合XSS的风险

这样不就OK了,弹框出现,说明

试试别的

常见魔法函数

一般两个下划线开头的函数都是魔术方法,所谓魔术无非就是会自动调用而已。

1.__construct()当一个对象创建时被调用(构造函数)<不需要返回值>

2.__destruct()当一个对象销毁时被调用(析构函数)<不需要返回值>

3.__toString()当一个对象被当作一个字符串使用被调用<需要有返回值return>

4.__sleep()在对象在被序列化之前被调用<需要有返回值return,返回需要序列化的变量数组>

5.__wakeup()在反序列化之后立刻被调用<不需要返回值>

<?php
  header("Content-type:text/html;charset=utf8");

  // 定义一个类
  class Persion{
    var $name;
    var $age;

    // __construct构造函数,实例化对象的时候自动调用
    function __construct($n,$a){
        $this->name = $n;
        $this->age = $a;
        echo "<br>__construct函数执行了<br>";
    }

    // __destruct,对象被销毁时自动调用
    function __destruct(){
        echo "<br>__destruct函数执行了,对象销毁了<br>";
    }

    // __toString,当对象被当做字符串处理时自动调用
    function __toString(){
        echo "<br>__toString函数执行了~<br>";
        return "__toString返回了~";
    }

    // __sleep(),对象在序列化之前被调用
    function __sleep(){
        echo "<br>__sleep函数执行了~<br>";
        return array("name","age");  // 哪个属性可以被序列化
    }

    // __wakeup(),在反序列化之后调用
    function __wakeup(){
        echo "<br>__wakeup函数执行了~<br>";
    }

  }

  // 实例化一个对象
  $p1 = new Persion("zhangsan",18);
  var_dump($p1);
  echo $p1;  // 将对象当做字符串处理

  // 序列化
  $data  = serialize($p1);
  echo $data;

  // 反序列化
  $obj = unserialize($data);
 

?>

反序列化漏洞

class S{
    var $test = "pikachu";
    function __construct(){
        echo $this->test;
    }
}

自己构造字节流:

  • 类名不能变,属性名不能变,值可以变化(由用户控制)
O:1:"S":1:{s:4:"test";s:8:"zhangsan";}

构造恶意的字节流

O:1:"S":1:{s:4:"test";s:26:"<script>alert(1);</script>";}

 反序列化小案例

 PHP 在线工具 | 菜鸟工具 (jyshare.com)

shell_exec($this->name);   不同的写法有不同的风险,这样的写法有RCE远程代码执行的风险,这次这个是反序列化结合RCE

<?php
    header("content-type:text/html;charset=utf8");

    class Person{
        var $name;
        var $age;
        // 构造函数,在new一个对象时会自动调用
        function __construct($n,$a){
            $this->name = $n;
            $this->age = $a;
        }

        // wakeup()在反序列化之后立刻被调用
        function __wakeup(){
            shell_exec($this->name);
        }

    }
    $data = $_GET['a'];
    $p2 = unserialize($data);


?>

反序列化漏洞防御

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

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

相关文章

基于SpringBoot+Vue的校园失物招领系统(带1w+文档)

基于SpringBootVue的校园失物招领系统(带1w文档) 基于SpringBootVue的校园失物招领系统(带1w文档) 本课题研发的校园失物招领系统管理系统&#xff0c;就是提供校园失物招领系统信息处理的解决方案&#xff0c;它可以短时间处理完信息&#xff0c;并且这些信息都有专门的存储设…

51单片机个人学习笔记16(红外遥控)

前言 本篇文章属于STC89C52单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 [1-1] 课程简介_哔哩…

Qt编程技巧小知识点(2)GPIB缓存区数据读取

文章目录 Qt编程技巧小知识点&#xff08;2&#xff09;GPIB缓存区数据读取小结 Qt编程技巧小知识点&#xff08;2&#xff09;GPIB缓存区数据读取 大端小端的问题&#xff0c;其主要表现如下例子&#xff1a; 例如&#xff1a;输入为QByteArray str "#14M\xB6q\xC1\n&qu…

ImageNet_2014数据集下载与解压

前言 最近在配OpenLongTailRecognition-OLTR代码用的ImageNet_2014&#xff0c;因为数据集较大的原因&#xff0c;导致下载和数据集配置一直被耽误&#xff0c;进度很满&#xff0c;故此记录&#xff0c;以背不时只用。 进入imageNet主页 注: 需要注册账号&#xff0c;教育邮箱…

【论文阅读】MobileNetV4 - Universal Models for the Mobile Ecosystem

文章目录 摘要一、介绍二、相关工作三、与硬件无关的帕累托效率四、通用倒置瓶颈五、移动MQA六、MNv4模型的设计6.1 为增强的体系结构改进NAS6.2 MNv4模型的优化 7. 结果7.1 ImageNet分类7.2 COCO目标检测 8. 强化蒸馏配方9. 结论 MobileNetV4 - 移动生态系统的通用模型 摘要 …

linux系统编程:(4)

1.系统时间的获取函数 1. time函数 功能: 获得1970年到现在的秒数 参数: t:存放秒数的空间首地址 返回值: 成功返回1970年到现在的秒数 失败返回-1 2.localtime 函数 功能: 将一个秒数转化成日历时间 参数: timep:保存秒数空间的地址 返回值: 成功…

Node.js异步编程

【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战&#xff08;Web前端技术丛书&#xff09;》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) 本节主要介绍Node.js异步编程的相关内容。内容包括 同步API、异步API、同步API与…

拿捏!远程观影之详细操作教程

碎碎念 相信不少小伙伴是有收藏影片的&#xff0c;时不时会取出来进行观看。大多时候&#xff0c;我们都是在局域网中观影&#xff0c;局域网中是直连&#xff0c;所以可以一直流畅进行观影&#xff0c;但是有不少朋友是有远程观影需求的&#xff0c;那么怎么实现能随时在手机…

squidpy学习总结

下载安装 首先不要使用pip install squidpy[interactive] 安装&#xff0c;因为我在base环境里python版本是python3.11.5, 导致安装narapi包的时候出现问题&#xff0c;所以我选择的办法是 conda create -n sp_env python3.9.12 注意这个有个问题&#xff0c;我的mac为啥建立不…

【git】git与​TortoiseGit​下载教程

下载地址&#xff1a;https://git-scm.com/ 下载TortoiseGit 官网链接&#xff1a;https://tortoisegit.org/ 拉去代码错误&#xff1a; 找到在本地安装的 git 服务的根目录 -> Git -> usr -> bin 目录下选中 ssh.exe &#xff0c;再点击打开即可&#xff0c;如下图&a…

在Ubuntu上基于NDK(r21)交叉编译FFmpeg for Android

各软件版本号&#xff1a;VMware为17 Pro、FFmpeg版本号为4.3.8、NDK版本号为r21e、Ubuntu版本号为20.04 1.下载FFmpeg4.3.8并解压 2.下载NDK&#xff08;r21e&#xff09;并解压 https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip 3.在ffmpeg-4.…

FastReport数据区横向排列展示

FastReport数据区横向排列展示 步骤1&#xff1a;设置数据区的Columns Editor属性 1、Count&#xff1a;2表示数据区里的控件将最多显示两列 2、AcrossThenDown&#xff1a;数据区里的控件将会被从做到右依次循环遍历 3、Width&#xff1a;9.25&#xff0c;因为我只设置了两列…

mmdebstrap:创建 Debian 系统 chroot 环境的利器 ️

文章目录 mmdebstrap 的一般性参数说明 &#x1f4dc;mmdebstrap 的常见用法示例 &#x1f308;使用 mmdebstrap 的注意事项 ⚠️ &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&am…

我的创新大赛经验分享:如何打磨优化项目

我的创新大赛经验分享&#xff1a;如何打磨优化项目 前言1. 强化创新性与独特性2. 深度市场调研与用户需求洞察3. 优化商业模式与财务规划4. 提升团队表现与协作效率5. 完善展示材料与演示技巧6. 模拟答辩与专家评审7. 关注细节与排除潜在问题结语 前言 在创新的浪潮中&#xf…

Vue前端服务加密后端服务解密--AES算法实现

在实际项目中考虑到用户数据的安全性&#xff0c;在用户登录时&#xff0c;前端需要对用户密码加密&#xff08;防止用户密码泄露&#xff09;&#xff0c;服务端收到登录请求时先对密码进行解密&#xff0c;然后再进行用户验证登操作。本文 AES ECB 模式来实现前端机密后端解密…

PLSQL导入导出ORACLE数据提示失败问题修改PLSQL配置

oracle中plsql导入提示无法导入问题 1.首先看下是否环境变量已经配置(具体配置看下面环境变量配置) 2.plsql数据导入中tools-->Preferences中配置如下框中的内容 3.设置 tnsnames.ora文件中看下是否设置有问题 4.PLSQL乱码问题 NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16…

C语言作业难题

计算 1 1/(2 * 3) 1/(3 * 4) ... 1/(n * (n 1)) ?直到最后一相值小于0.00001为至。 参考代码&#xff1a; #include <stdio.h> int main() { // 定义一个变量用来存储累加结果 double sum 1;// 将第一个运算数直接赋值给sum,后期程序无需在处理 double n 2; //…

如何快速对接Android平台GB28181接入模块(SmartGBD)

好多开发者希望我们不是从代码级&#xff0c;而是从流程方面&#xff0c;大概介绍下Android端GB28181设备接入段模块。本文以SmartGBD的Camera2Demo为例&#xff0c;大概聊下相关的集成流程。 大牛直播SDK推出的Android平台GB28181接入SDK&#xff08;SmartGBD&#xff09;&am…

git commit提示node不是内部或外部命令,也不是可运行的程序 或批处理文件。

使用git commit 提交项目时提示"node" 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 但是node早已安装了&#xff0c;node -v也能正常显示版本号&#xff0c;我检查了环境变量等配置&#xff0c;都是正常的 E:\work\2024\project12\DEMO>gi…

慧灵——引领智能机器人行业新潮流

随着人工智能和机器人技术的迅猛发展&#xff0c;智能机器人行业正迎来前所未有的增长潜力和创新机遇。慧灵科技作为行业内的佼佼者&#xff0c;以其创新技术和卓越性能&#xff0c;正在引领智能机器人行业的新潮流。 智能机器人行业是一个充满活力和潜力的领域。随着全球人口老…