PHP反序列化漏洞

一、概述

在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。

序列化serialize()

序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

class S{
    public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
    O:代表object
    1:代表对象名字长度为一个字符
    S:对象的名称
    1:代表对象里面有一个变量
    s:数据类型
    4:变量名称的长度
    test:变量名称
    s:数据类型
    7:变量值的长度
    pikachu:变量值

反序列化unserialize()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu

漏洞举例

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

   常见的几个魔法函数:
   __construct()当一个对象创建时被调用
   __destruct()当一个对象销毁时被调用
   __toString()当一个对象被当作一个字符串使用
   __sleep() 在对象在被序列化之前运行
   __wakeup将在序列化之后立即被调用
   漏洞举例:
   class S{
       var $test = "pikachu";
       function __destruct(){
           echo $this->test;
       }
   }
   $s = $_GET['test'];
   @$unser = unserialize($a);
   payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

二、实验演示

查看源代码

在这里插入图片描述

反序列化一般通过代码审计发现
我们自己写一个serialize.php:

<?php
class S{
    var $test = "<script>alert('xss')</script>";
}
echo '<br>';
$a = new S();
echo serialize($a);
?>

然后已查看源码的形式访问url:
view-source:http://localhost/pikachu/vul/unserilization/serialize.php
得到序列化后的值:
在这里插入图片描述

构造playload,在反序列化漏洞网站注入

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

在这里插入图片描述

我们发现,出现一个xss弹窗,然后可以进行xss攻击了。

参考链接:https://www.cnblogs.com/dogecheng/p/11652022.html

### PHP 反序列化漏洞原理 PHP反序列化漏洞,亦称为PHP对象注入,属于常见的一类安全缺陷。当程未充分校验来自用户的反序列化字符串时,就可能允许攻击者操控反序列化进程,从而触发意外行为甚至远程代码执行[^2]。 具体而言,如果应用接受并处理由用户提交的数据作为`unserialize()`函数的参数,则可能存在风险。这是因为未经审查的内容能够影响到内部逻辑流程,特别是那些定义了魔术方法的对象实例(如`__wakeup()`, `__destruct()`),它们会在特定时刻自动调用,成为潜在入口点用于实施攻击[^3]。 例如,下面给出了一种构造恶意负载的方式: ```php O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";} ``` 这段看似无害的字符串,在某些条件下经过不当解析之后可能会导致跨站脚本(XSS)攻击的发生。 ### 防护措施 针对上述提到的风险,采取有效的预防手段至关重要。首要原则是对所有外部输入持怀疑态度,并严格执行白名单过滤机制;其次要定期维护软件版本至最新状态以获得官方发布的补丁支持[^4]。 另外值得注意的是,应当尽可能减少使用内置的`unserialize()`功能,转而考虑更安全替代方案比如JSON格式交换数据结构。对于确实需要用到此类操作的情况,则务必通过哈希验证等方式确认消息完整性后再继续后续动作。 最后提醒开发者们始终遵循最小权限原则设计系统架构,即使发生突破也能有效遏制损害范围扩大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值