代码审计第八篇-反序列化

GinTvT 发布于 2025-02-23 141 次阅读 未分类 预计阅读时间: 3 分钟


反序列化在实战中意义不大,在实战中不会自己独立去审计一条POP链,可以使用自动挖掘反序列化的工具例如tabby等工具去挖掘

序列化:把对象转换为字节的过程

反序列化:把字节还原为对象的过程

Python

以cPickle和pickle来个模块来实现反序列化,cPickle使用c语言写的,跑得快,pickle是用python写的,跑得慢,在python3中不包含cPickle模块,基本不考虑,pickle有四种操作方法

dump 对象序列化到⽂件对象并存⼊⽂件

dumps 对象序列化为 bytes

load 对象反序列化并从⽂件中读取数据

loads 从 bytes 对象反序列化

Python的魔法函数有__reduce__

PHP

以下是魔法函数

__wakeup() //使⽤unserialize时触发 !!
__sleep() //使⽤serialize时触发
__destruct() //对象被销毁时触发 !!
__call() //在对象上下⽂中调⽤不可访问的⽅法时触发 !!
__callStatic() //在静态上下⽂中调⽤不可访问的⽅法时触发
__get() //⽤于从不可访问的属性读取数据
__set() //⽤于将数据写⼊不可访问的属性
__isset() //在不可访问的属性上调⽤isset()或empty()触发
__unset() //在不可访问的属性上使⽤unset()时触发
__toString() //把类当作字符串使⽤时触发,file_exists()判断也会触发 !!
__invoke() //当脚本尝试将对象调⽤为函数时触发

以这个代码为例

<?php
 class test
 {
 private $flag = "flag{233}";
 public $a = "aaa";
 static $b = "bbb";
 }
 $test = new test;
 $data = serialize($test);
 echo $data;
?>
O:4:"test":2:{s:10:"testflag";s:9:"flag{233}";s:1:"a";s:3:"aaa";}
O:<class_name_length>:"<class_name>":<number_of_properties>:
{<properties>}

对象标识符 (O):
O 表示这是一个对象。
类名长度 (4):
4 表示类名的长度为 4 字符。
类名 ("test"):
test 表示类名为 test。
属性数量 (2):
2 表示该对象有 2 个属性。
属性列表 ({...}):
{...} 表示属性列表开始。
第一个属性 (s:10:"testflag";):
s:10: 表示字符串长度为 10。
"testflag" 表示属性名为 testflag。
第一个属性值 (s:9:"flag{233}";):
s:9: 表示字符串长度为 9。
"flag{233}" 表示属性值为 flag{233}。
第二个属性 (s:1:"a";):
s:1: 表示字符串长度为 1。
"a" 表示属性名为 a。
第二个属性值 (s:3:"aaa";):
s:3: 表示字符串长度为 3。
"aaa" 表示属性值为 aaa。

此作者没有提供个人介绍。
最后更新于 2025-04-23