现在在ctf比赛中PHP的反序列题目出得有一些多,当然,是我感觉的 emmm 之前没有怎么好好去了解这个问题 碰到这类题目的时候都是代码好的同学在做 然后这段时间看了一下这些东西 就写一些东西吧 自己的想法

——————————————————————————分割线————————————————————————————

首先 什么是序列化 

在php中序列话原名叫串行化 又叫序列化

对象也是一种在内存中存储的数据类型,他的寿命通常随着生成该对象的程序终止而终止。有时候可能需要将对象的状态保存下来,需要时再将对象恢复。对象通过写出描述自己状态的数值来记录自己,这个过程称对象的串行化

1、什么是变量序列化

1)序列化是将变量转换为可保存或传输的字符串的过程;
2)反序列化就是在适当的时候把这个字符串再转化成原来的变量使用;
3)这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性;
4)序列化有利于存储或传递 PHP 的值,同时不丢失其类型和结构

再简单点 序列化就类比于你把一架完好的飞机 给带回家 但是现在飞机没有油 又没有那么大的车 你只能拆掉 然后一部分一部分的运回去  反序列化就是回去重新组装一下

给一个例子 

class Person {
        public $name;
        public $age;
        public $sex;

function __construct($name, $age, $sex) {
            $this->name = $name;
            $this->age = $age;
            $this->sex = $sex;

function say() {

echo "我的名字是:($this->name),我的年龄是($this->age),我的性别是($this->sex")

}

$a= new Person(xxx,21,男);

echo $a->say();

这样会输出say方法的内容

但是我想在另一个地方也用这个方法怎么办呢

把刚才的那个php文件给保存起来 叫做1.php

然后新建一个php文件 叫做2.php

include "1.php"; //将源php给包含进去

$b = new Person(xxx,21,男) ;//实例化 这时候你要是输出 echo $b->say() 照样可以用

$str = serialize($b) ;//将内容全部字符化

serialize函数用于序列化对象或者数组,并且返回一串字符串,这个字符串方便传递

file_put_contents("text.txt",$str);  //将这些全部给放到text.txt文件中 

然后打开会看到一串乱码 这就是字符化之后的对象

传递之后,要把字符串给反序列化为原始的对象结构

include "1.php"

  $str = file_get_contents("text.txt"); //从文件中读出字符串

然后反序列化

$c=unserialize($str)

echo $c->say();

又可以输出之前的内容了

好的,现在讲一道ctf的题

 

 

php序列化与反序列化+ctf题目

定义了一个xctf的类 属性是$flag=111 但是出现了一个魔术方法 百度了一下_wakeup()执行漏洞 

如果存在魔术方法_wakeup()   反序列化时会首先调用它 但是如果它的属性被修改了 就不会调用它

所以应该就是利用_wakeup漏洞拿flag 

实例化这个类

$a=new xctf (code)

$str=serialize($a)

echo $str

发现得到O:4:"xctf":1:{s:4:"flag";s:3:"111";} 序列化之后的字符串

只要删掉xctf":1的那个1 把它改成大于一的数字就可以    1是属性的数量

对其传参?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}  拿到flag

php的东西颇多 用的东西也多 以后还会放一些PHP反序列化的东西

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章: