概述
目录
一、简介:
二、原理:
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、输入执行
将序列化后的复制到输入框提交
会产生弹窗
最后
以上就是过时大门为你收集整理的(37)【PHP反序列化】PHP反序列化原理、函数、利用过程一、简介:二、原理:三、常见的序列化格式:四、产生的原因:五、魔术方法(触发):六、利用:的全部内容,希望文章能够帮你解决(37)【PHP反序列化】PHP反序列化原理、函数、利用过程一、简介:二、原理:三、常见的序列化格式:四、产生的原因:五、魔术方法(触发):六、利用:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复