引进序列化
以下为个人笔记
认识各类型序列化后的样子
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对
象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,
重新创建该对象。
相关函数
serialize() 序列化
函数用于序列化对象或数组,并返回一个字符串。序列化对象后,可以很方便的将它传递给其他需要它
的地方,且其类型和结构不会改变。如果想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()
演示代码:
<?php>
$str1="godyu521"; #定义字符串的序列化
$num=20240203; #定义数字的序列化
$test_bool=True;#定义布尔值的序列化
$str3=array("shenyu",1,"godyu"); #定义数组的序列化
$str2=serialize($str1);
print serialize($num)."\n";
print serialize($test_bool)."\n";
echo $str2."\n";
echo serialize($str3)."\n";
class Godyu{
public $test="phpserialize"; #定义对象的序列化
public $test2="study";
function g(){
echo "godyu loves ctf"."\n";
echo $this->test2;
}
}
$a=new Godyu();
print serialize($a)."\n";
print $a->g();
?>
序列化只会序列化属性不会序列化方法
触发反序列化的一些魔术方法
特殊属性的反序列化
protected类似python中的封装 直接调用无法调用 但在另一个方法里可以调用
如果是私有成员会在前面加上对象的属名,如果是继承类的就需要加*
GOdyu前后被空字符NULL包裹 ->空字符包裹前后的特殊属性
反序列化
反序列化其实就是把序列化之后的反回来给原来的
<?php
$data = 's:8:"godyu521";'; // 将序列化字符串赋值给变量$data
$result = unserialize($data); // 使用unserialize()函数解码序列化字符串
print($result)."\n";
?>
漏不漏洞的先不提,先来两道CTFshow题
第一个算是没考序列化和反序列化 只是引入逻辑
Web254
那直接传get让他们等于
Web255
我们去复制ctfShowUser的属性 方法不用复制 方法不能被序列化
写一下cookie里需要传的参数
<?php
class ctfShowUser{
public $username='xxxxxx';
public $password='xxxxxx';
public $isVip=True;
}
$user = new ctfShowUser();
$u=serialize($user);
print $u."\n";
$u1=unserialize($u);
print_r ($u1);
?>
写进cookie里
发送即可
最近有些懈怠了
THE END
暂无评论内容