不安全的反序列化
01 为什么要序列化
序列化,“将对象的状态信息转换为可以存储或传输的形式的过程”。在序列化期间内,将对象当前状态 写⼊到临时或永久性的存储区。以后,就可以通过从存储区中读取或还原(反序列化)对象的状态,重新创建该对象。
简单的说,序列化就是把⼀个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台安全的 进⾏通信。
02 PHP 中的序列化与反序列化
PHP 的反序列化漏洞也叫PHP 对象注⼊,是⼀个⾮常常⻅的漏洞,这种漏洞在某些场景下虽然有些难 以利⽤,但是⼀旦利⽤成功就会造成⾮常危险的后果。
漏洞形成的根本原因就是程序没有对⽤户输⼊的反序列化字符串进⾏检测,导致反序列化过程可以被恶 意控制,进⽽造成代码执⾏、GetShell 等⼀系列不可控的后果。反序列化漏洞并不是PHP 特有的,也存 在与Java、Python 语⾔中。其原理基本相同。
serialize();
unserialize();
简单的例⼦ - JSON 数据
JSON 是数据的⼀种表达形式,与Python ⾥的字典类似。
// json.php
//?name=ajest&age=18&sex=true&score=89.9
$stu = array(
'name' => 'AJEST',
'age' => 18,
'sex' => true,
'score' => 89.9
);
echo $stu;
echo "<hr />";
$stu_json=json_encode($stu);
echo $stu_json;
$stu_json_decode = json_decode($stu_json);
echo "<hr />";
var_dump($stu_json_decode);
echo "<hr />";
echo $stu_json_decode -> name;
序列化Demo
#序列化与反序列化
# 主要是针对对象
抽象的数据结构 --序列化--> 字符串 --反序列化--> 抽象的数据结构
#创建⼀个类
// stu.class.php
class Stu{
public $name;
public $age;
public $sex;
public $score;
}
#创建对象
<?php
// serialize.php
include "stu.class.php";
$stu1 = new Stu();
$stu1 -> name = "AJEST";
$stu1 -> age = 24;
$stu1 -> sex = true;
$stu1 -> score = 99.9;
//var_dump($stu1);
//echo $stu1;
$stu1_ser = serialize($stu1);
echo $stu1_ser;
?>
#序列化后的字符串
O:3:"Stu":4: {s:4:"name";s:5:"AJEST";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.90000 0000000006;}
#反序列化
<?php
// unserialize.php
include "./stu.class.php";
if(!empty($_GET['obj'])){
$str = $_GET['obj'];
}else{
$str = 'O:3:"Stu":4:
{s:4:"name";s:5:"AJEST";s:3:"age";i:18;s:3:"sex";b:1;s:5:"score";d:89.9000
00000000006;}';
}
echo $str;
echo "<hr />";
$stu1 = unserialize($str);
//echo $stu1;
var_dump($stu1);
?>
3 漏洞何在?
<?php
// stu.class.php
class Stu{
public $name;
public $age;
public $sex;
public $score;
}
?>
<?php
//vul.php
include "vul.class.php";
$test = new Test();
echo serialize($test);
echo "<hr />";
$test = unserialize(@$_GET['obj']);
var_dump($test);
?>
反序列化执⾏代码
O:4:"Test":1:{s:3:"str";s:5:"AJEST";}
O:4:"Test":1:{s:3:"str";s:12:"dnsec.com.cn";}
O:4:"Test":1:{s:3:"str";s:10:"phpinfo();";}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)