0x00 前言

一直想找个时间强化下专题训练,反序列在实战代码审计中用的挺多的,但我一直都没有好好强化过,连一条很短的pop链都构造不出来,这两天好好强化下。

0x01 从基础开始

利用serialize将一个对象转化为字符串形式。

<?php

class A{
	public $name = 'd3vil';
	protected $age = 18;
	private $sex = 'boy';
}
$a = new A();

print_r($a);

echo "</br>";
$ser_a = serialize($a);

print_r($ser_a);

得到的结果是

A Object ( [name] => d3vil [age:protected] => 18 [sex:A:private] => boy )
O:1:”A”:3:{s:4:”name”;s:5:”d3vil”;s:6:”*age”;i:18;s:6:”Asex”;s:3:”boy”;}

O代表是一个类实例化对象

1是类名称长度

A是类名称

有3个成员属性

s代表字符串

长度为4的name

值是长度为5的d3vil

注意后面两个属性,一个是protected,一个是private

我们用urlencode之后看看

O%3A1%3A%22A%22%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A5%3A%22d3vil%22%3Bs%3A6%3A%22%00%2A%00age%22%3Bi%3A18%3Bs%3A6%3A%22%00A%00sex%22%3Bs%3A3%3A%22boy%22%3B%7D

在protected属性中,键名前要加%00%2A%00age,也就是\x00*\x00,这也是键名长度为6的原因,在private键名前要加\x00类名\x00。

三者区别

public(公共的):在本类内部、外部类、子类都可以访问

protect(受保护的):只有本类或子类或父类中可以访问

private(私人的):只有本类内部可以使用

可以看出,protect是只是不让外部访问,private是只能本类访问。

所以$a -> sex = '123';这种方式只有public才行,在构造链子的时候,如果要改其他两个直接在类函数里加

反序列化

定义:反序列化就是利用unserailize()函数将一个经过序列化的字符串还原成php代码形式

反序列化漏洞原理

在反序列的时候会调用魔术方法

__construct()当一个对象创建时被调用

__destruct()当一个对象销毁时被调用

__toString()当反序列化后的对象被输出的时候(转化为字符串的时候)被调用

__sleep() 在对象在被序列化之前运行

__wakeup将在序列化之后立即被调用

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

larvel Previous
vulhub Next