WEB应用(十六)---反序列化

news2024/12/24 22:13:42

反序列化的概念

在面向对象编程语言中,就是将对象转化为字节流,这一步是序列化,字节流中包括这个对象的数据和信息,便于传输和存储,是可以在网络中传输的。需要时,通过反序列化从字节流中恢复对象。

类似于物流快递对物品的处理过程。拆解打包 =>运输 =>拆包组装

接下来我们去写一个代码,体会一下,创建类,实例化为对象,从对象转化为字节流(序列化),再由字节流转化为对象(反序列化),话不多说直接上代码,同样在www下创建文件夹,去访问

<meta charset="utf-8">
<?php
// 1.定义类
class Person{
    var $name;
    var $age;
    function __construct($name1,$age1 )
    {
        $this->name = $name1;
        $this->age = $age1;
    }
    function show()
    {
        echo '姓名:'.$this->name.',年龄:'.$this->age.'<br>';
    }
}
//2. 通过类实例化对象
$p1=new Person("张三丰",101);
// 3. 使用对象的成员
$p1->show();
echo "太极创始人:".$p1->name."<br>";
var_dump($p1);
echo "<br>";
// 4. 将对象序列化为字节流
$data = serialize($p1);
// 5. 打印字节流数据
echo $data."<br>";
// 6. 将字节流反序列化为对象
$p11 = unserialize($data);
var_dump($p11);
echo "<br>";

?>

反序列化的漏洞产生原理

序列化和反序列化本身并不存在问题。但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。可以理解为数据在传输时,遭到了篡改,就好像是,我们的快递在运输时,让人掉包了,但是经过正常的运输流程还是到了你的手上,当你去打开使用时发现,出问题了。

我们还是通过写代码的方式来演示

<meta charset="utf-8">
<?php
// 1.定义类
class Person{
    var $name;
    var $age;
    function __construct($name1,$age1 )
    {
        $this->name = $name1;
        $this->age = $age1;
    }
    function show()
    {
        echo '姓名:'.$this->name.',年龄:'.$this->age.'<br>';
    }
}
//2. 通过类实例化对象
$p1=new Person("张三丰",101);
// 3. 使用对象的成员
$p1->show();
echo "太极创始人:".$p1->name."<br>";
var_dump($p1);
echo "<br>";
// 4. 将对象序列化为字节流
$data = serialize($p1);
// 5. 打印字节流数据
echo $data."<br>";
// 数据在传输的时候,就有可能遭到篡改,就会产生反序列化漏洞
// $data = 'O:6:"Person":2:{s:4:"name";s:9:"张三丰";s:3:"age";i:101;}';
// 将name的值篡改成恶意JS代码,当反序列化时,使用name的值的时候,就会执行恶意代码
// 这里的25值是根据后面的代码所占有的字节数决定的,如果不一致,就会产生错误
$data = 'O:6:"Person":2:{s:4:"name";s:25:"<script>alert(1)</script>";s:3:"age";i:101;}';
// 当我们传参输入?data=O:6:"Person":2:{s:4:"name";s:25:"<script>alert(1)</script>";s:3:"age";i:101;},这里就可以是来自用户的输入,发现也可以执行代码
$data = $_GET['data'];
// 6. 将字节流反序列化为对象
$p11 = unserialize($data);
var_dump($p11);
echo "<br>";

?>

下面就要进入靶场来实践了,

通过上面的演示,我们知道要输入?data=O:6:"Person":2:{s:4:"name";s:25:"<script>alert(1)</script>";s:3:"age";i:101;}这样的字符串才可以,但是我们并不知道这里的类是怎么样进行创建的所以我们看看源代码,路径

 可以看到这里已经写好了payload,我们拿去执行,如果你说那我们怎么知道后端的类是怎么写呢,就一个字猜

 这会有人就会说,怎么不讲讲魔法函数,这不就来嘛,但是我们要注意,上面我们没有使用魔法函数,但是反序列化漏洞依然存在,所以两者没有必然的联系。

那么魔法函数是什么,一般两个下划线开头的函数都是魔术方法,所谓魔术无非就是会自动调用而已。下面列举一些常见的魔法函数:

  1. __construct() 当一个对象创建时被调用
  2. __destruct()当一个对象销毁时被调用
  3. __toString()当一个对象被当作一个字符串使用被调用
  4. __sleep()在对象在被序列化之前被调用
  5. __wakeup()在反序列化之后立刻被调用

下面我们通过代码底层逻辑来了解到底是怎么一回事,做法和上面一样,写好后,去访问,看看效果,同时去理解代码,闲言少叙,直接上代码

<meta charset='utf-8'>
<?php
// 1.定义类
class Phone {
    var $brand;//品牌
    var $color;//颜色
    var $price;//价格

    // 魔法函数,有用户定义,由系统自动调用(回调函数)
    // 构造函数,在实例化对象时,被调用
    function __construct($b,$c,$p){
        $this->brand = $b;
        $this->color = $c;
        $this->price = $p;
        echo "__construct<br>";
    }
    // 构造函数,在对象销毁前调用
    function __destruct() {
        // 有可能会把对象写入文件中,因为要销毁嘛
        echo "__destruct<br>";
    }

    // 将对象转换为字符串的函数,在对象当成字符串使用时去使用时有系统调用
    function __tostring() {
        echo "__tostring<br>";
        return $this->brand.$this->color.$this->price;
    }

    // 在序列话之前,有系统调用,这个函数可以决定序列化时,调用哪些成员
    function __sleep() {
        echo "__sleep<br>";
        return array('brand','color','price');// 在这里我们取消一个成员,看看有什么变化,即return array('brand','color')
    }

    // 在反序列化之后,由系统调用
    function __wakeup() {
        echo "__wakeup<br>";
    }
}
$p1 = new Phone("vivo","黑色",5000);
// var_dump($p1);
// 注意这里echo是不允许输出对象的,那么我们就需要使用,__tostring这个函数来输出
echo $p1."<br>";
// echo "<br>";
$data = serialize($p1);// 如果没有进行序列化,那么也就不会执行__sleep函数
echo $data."<br>";
$p2 = unserialize($data);// 到这里就有了俩个对象$p1,$p2,那么__destruct()这个函数就会被执行俩次
// 观察每一次输出函数名时的位置,就可以清晰的知道这个函数是什么时候被调用的
?>

 这次代码较多,还望大家多多理解代码的含义,先去理解底层逻辑,才能更好的渗透不是吗。

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

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

相关文章

State-Threads初识

1.项目简介 协程&#xff08;coroutine&#xff09;不是进程或线程&#xff0c;其执行过程更类似于子例程&#xff0c;或者说不带返回值的函数调用。 一个程序可以包含多个协程&#xff0c;可以对比与一个进程包含多个线程。 我们知道多个线程相对独立&#xff0c;有自己的上下…

Dopple Labs 选择 Zilliz Cloud 作为安全高效的向量数据库

一直以来&#xff0c;我都十分赞同采用通用的标准来评估机器学习领域的技术。向量数据库领域也是如此。Zilliz 发布的性能测试对我有着很大的帮助。 ——Sam Butler Dopple.AI 机器学习总监 01.Dopple AI简介 Dopple Labs Inc. 是 Dopple.AI 的原厂&#xff0c;通过提供创新…

我是如何选择适合我的电脑的

当前有什么可以供自己选择 将从便携、性能、价格、游戏、视频剪辑、高性能、接口、屏幕、使用感受等方面考虑(超出普通人范围电脑不考虑) 非苹果&#xff1a; 轻薄笔记本&#xff1a;最便捷办公笔记本&#xff1a;游戏笔记本台式电脑台式游戏电脑台式高性能电脑 苹果&#…

ROM修改进阶教程------修改rom 内置app的几种方法与注意事项 以及运行库中arm64 .rmeabi-v7a与armeabi 区别

在定制rom的过程中。内置app是很多rom爱好者必须的技能之一。但对于初学者来说。会遇到内置的app无效果或者出现运行有bug的情况。内置app需要根据安卓版本的不同略有变化 .在高安卓版本中还需要内置apk的运行库。 通过今天的博文了解; 1-----内置APP的几种方式步骤 2-----视…

OpenHarmony南向开发 SA服务SELinux权限配置一站式傻瓜式教程

Selinux权限配置 OpenHarmony中SELinux使用详解 目录 SELinux简介SELinux概念SELinux模式OH中SELinux使用详解新增SA服务如何配置SELinux权限SELinux简介 SELinux是Security Enhanced Linux 的缩写,也就是安全强化的 Linux,旨在增强传统Linux操作系统的安全性,解决传统Li…

关于使用webflux开发思考

1、目前终于看到有系统使用spring的webflux进行系统开发&#xff0c;主要原因是比如gpt、千问的大模型数据返回都支持流式方式返回&#xff0c;比如和用户对话&#xff0c;可以流式的把数据给用户展示&#xff0c;不用一次性把数据展示到页面上。 webflux还有一个能力就是&…

MongoDB笔记1——MongoDB简介

MongoDB 什么是MongoDB 2007年10月&#xff0c;MongoDB由10gen团队所开发&#xff0c;2009年2月首度推出。 基于分布式文件存储的数据库由C语言编写。旨在为WEB应用提供可拓展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库&#xff08;NoSQL&…

东芝新小黑移动硬盘数据被格式化如何恢复(2024年8月版)

在数字化时代&#xff0c;数据已成为我们生活和工作中不可或缺的一部分。东芝新小黑移动硬盘&#xff0c;以其便携性和大容量&#xff0c;成为许多用户存储重要数据的首选。然而&#xff0c;当这些宝贵的数据因意外格式化而面临丢失的风险时&#xff0c;我们该如何应对&#xf…

Visionpro二次开发学习笔记7-使用CogToolDisplay控件

CogToolDisplay控件可显示与视觉工具记录相关的图像&#xff0c;图形和其他状态信息。它使用CogRecord和ICogTool接口将图像和图形连接到CogDisplay。 图片清单 控件的CogComboBox列出当前记录及其子记录中的图像和图形。您可以单击列表并选择要显示的图像或图形。如果记录层…

基于springboot3实现单点登录(二):认证服务端搭建

前言 上文我们介绍了oauth2.0的相关理论和流程&#xff0c;本文我们继续实现。 Oauth2协议中有个很重要的概念&#xff0c;叫做”端点“&#xff0c; 以下整理了一些常用的端点及其参考访问路径及使用场景的信息&#xff0c;供参考。 这些端点在oauth2.0协议的整个生命周期…

白嫖不是梦,三分钟搞定一台服务器

在知乎上浏览时&#xff0c;我偶然发现了一个引人入胜的话题。这个话题附带了一张Excel表格的截图&#xff0c;表格设计得非常巧妙。它允许用户输入包括日薪、工作时间、通勤时间、休息时间以及学历等在内的多个变量。通过这些输入&#xff0c;表格能够计算出一个反映工作性价比…

JAVA—正则表达式

关于正则表达式的了解学习&#xff0c;以及用于校验格式&#xff0c;信息查找和替换分割内容。 目录 1.概述 2.书写规则 3.应用案例 4.用于信息查找 5.用于搜索替换&#xff0c;分割内容 1.概述 由一些特定的字符组成&#xff0c;代表一个规则 作用&#xff1a; 1.校验数据…

国外高清风景视频素材无水印哪里找?

哪里可以下载国外高清风景视频素材&#xff1f;有哪些高清海外素材网站&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就来给大家揭秘可以下载国外高清风景视频素材的网站&#xff0c;赶紧进来看看吧&#xff5e; 1. 稻虎网 稻虎网作为国内外知名视频素材网站&a…

【机器学习】 Sigmoid函数:机器学习中的关键激活函数

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Sigmoid函数&#xff1a;机器学习中的关键激活函数1. 引言2. Sigmoid函数定义3.…

C++day04

1】思维导图 2】完成关系运算符重载&#xff0c;实现成员函数和全局函数的版本。 #include <iostream>using namespace std;class Stu { friend bool operator<(const Stu &L,const Stu &R); private:int age;int id; public:Stu(){}Stu(int age,int id):age…

OD工具-18个实操工具共创会

一、什么是共创会1.1 什么是共创共创&#xff0c;共同创造词组的缩写&#xff0c;字面上来看就是团队为了多个个体一起把以前没有的事物给产生出或者造出来&#xff0c;这明显的是一种典型的人类自主行为。 托德老师有一段描述:共创是一种工作状态&#xff0c;让团队中的每个个…

【时时三省】(C语言基础)操作符3

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 &取地址操作符 示例: 每个内存单元都有自己的编号 编号就成为内存单元的地址&a就是找出a的地址 后面可以加一个int *pa&#xff1d;&a 是可以用来存放地址 pa是用来存放地址的…

SQL进阶技巧:有序数据合并问题之如何按照指定的规则对数据进行合并?【详解collect_list函数有序性保证】

目录 0 问题描述【小红书面试题】 1 数据准备 2 问题分析 3 小结 0 问题描述【小红书】 有如下需求,需要将左边的表变换成右边的表,注意字段内容的顺序及对应内容的一致性。 第一个字段为name,第二个字段为subject,第三个字段为score,变换后要求subject按照语文、数学…

电脑管家软件搬运导致edge、chrome浏览器不可用

最新版本的腾讯电脑管家可以直接搬运软件到其他路径&#xff0c;但是搬运浏览器会造成软件问题&#xff0c;不建议搬运。 浏览器恢复到原路径&#xff0c;可以解决浏览器不可用的问题&#xff1a; 首先到达你的搬运路径下 可以看到软件文件夹&#xff0c;比如Microsoft Edge或…

C++11——包装器和绑定

1.包装器 C中有一些可调用对象&#xff0c;比如 函数指针&#xff0c;仿函数对象 lambda等等&#xff0c;但是他们又有缺点 因此就引出了包装器的概念 包装器 function的头文件是<functional> 我们可以用包装器包装函数指针&#xff0c;仿函数&#xff0c;lambda int …