(37)【PHP反序列化】PHP反序列化原理、函数、利用过程

目录

一、简介:

二、原理:

2.1、函数:

2.1.1、serialize()序列化

2.1.2、unserialize()反序列化

三、常见的序列化格式:

四、产生的原因:

4.1、无类:

4.2、有类:

五、魔术方法(触发):

六、利用:

6.1、分析

6.2、构造序列化

6.3、输入执行


(智者千虑,必有一失) 


一、简介:

序列化就是将数据转化成一种可逆的字符串,字符串还原原来结构的过程叫做反序列化

序列化后,方便保存和传输(保留成员变量,不保留函数方法)

数据(对象)--------序列化---------->字符串-----------反序列化-------->数据(对象)

二、原理:

2.1、函数:

2.1.1、serialize()序列化

将一个对象转换成可以传输的一个字符串

序列化对象后,可以方便的将它传递到其他需要它的地方,且其类型和结构不会改变

eg:

class S{

public $test="pikachu";

}

$s=new S(); //创建一个对象

serialize($s); //把这个对象进行序列化

2.1.2、unserialize()反序列化

将序列化后的字符串还原成一个对象,或数组(即进行反序列化),并返回原始的对象结构

并在后面的代码中继续使用,加密后的字符串如下所示

对字符串代码进行分析:

$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");

echo $u->test; //得到的结果为pikachu

O:1:"S":1:{s:4:"test";s:7:"pikachu";} //这是序列化结果

O:代表object         1:代表对象名字长度为一个字符         S:对象名称         1:代表对象里面有一个变量          s:数据类型        4:变量名长度         test:变量名称         s:数据类型         7:变量值的长度         pikachu:变量值


三、常见的序列化格式:

二进制格式

字节数组

json字符串

xml字符串

……

布尔型(bool):b

整数型(int):i

字符串型(str):s

数组型(array):a

对象型(object):O

NULL型:N


 

四、产生的原因:

对用户的输入检测不严

4.1、无类:

当未检测出攻击者输入的序列化字符串中包含的恶意执行语句

攻击者从而达到控制反序列化过程,进而进行恶意代码的执行(好比SQL注入,目录遍历等操作)

4.2、有类:

当进行反序列化的时候就有可能会触发对象中的一些魔术方法


五、魔术方法(触发):

(前提:有可利用的类)

__construct()        //创建对象时触发

__destruct()        //对象销毁时触发

__call()        //在对象中调用不可访问的方法时触发

__callStatic()        //在静态中调用不可访问的方法时触发

__get()        //用于从不可访问的属性读取数据

__set()        //用于将数据写入不可访问的属性

__isset()        //在不可访问的属性上调用isset()或empty()触发

__unset()        //在不可访问的属性上使用unset()时触发

__invoke()        //当脚本尝试将对象调用为函数时触发

__wakeup()        //执行unserialize()时,先会调用这个函数

__sleep()        //执行serialize()时,先会调用这个函数


六、利用:

6.1、分析

因为这是反序列化API

所以要先把包含执行语句的php序列化

6.2、构造序列化

编写包含恶意语句的php

下面是一个弹窗

-------------------------------------------

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

$a = new S();
echo serialize($a);
?>

------------------------------------------

 

构造出来是:

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

并将其进行序列化(网上的在线工具都可)

6.3、输入执行

将序列化后的复制到输入框提交

会产生弹窗

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑色地带(崛起)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值