当前位置:网站首页>反序列化漏洞
反序列化漏洞
2022-08-04 08:35:00 【弥补之途】
介绍
(反)序列化
序列化 :将对象转换为字符串以便存储传输的一种方式。
反序列化:将字符串转换为对象供程序使用。
在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()。
<?php class Stu{ public $name; public $age; public $addr; public function demo(){ echo "你好啊!\n"; } } $stu=new Stu(); $stu->name="aaa"; $stu->age=34; $stu->addr="上海"; echo "对象初始值:\n"; print_r($stu); $stus=serialize($stu); //序列化 echo "\n对象序列化后的值:\n"; print_r($stus); $stb=unserialize($stus); //反序列化 echo "\n\n对象反序列化后的值:\n"; print_r($stb); ?>
运行结果
PHP魔术方法
魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,利用魔术方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)。 问题就出现在重载过程中,执行了相关代码。
__construct() :构造函数,当创建对象时自动调用。
__destruct():析构函数,在对象的所有引用都被删除时或者对象被显式销毁时调用,当对象被销毁时自动调用。
__wakeup():进行unserialize时会查看是否有该函数,有的话有限调用,初始化对象。
__ toString():当一个类被当成字符串时会被调用。
__sleep():当一个对象被序列化时调用,可与设定序列化时保存的属性。
魔术方法的运用
<?php
class Stu{
public $name;
public $age;
public $add;
function __construct(){
print "构造函数".PHP_EOL; //换行符
}
function __destruct(){
print "析构函数\n";
}
function __wakeup(){
print "\n返序列化函数调用初始化函数wakeup()";
}
/*让应用程序能够将类作为一个字符串输出(echo $obj),而且
其他类也可能定义了一个类允许 __toString读取某个文件。*/
function __toString(){
return $this->name."toString字符串";
}
/*function __sleep(){
print "序列化时调用该函数";
}*/
}
//创建几次对象,执行几次构造函数
$stu=new Stu();
$stu->name="fpp";
$stu->age=34;
$stu->add="dfdgg";
$stus=serialize($stu); //序列化
echo "\n对象序列化后的值:\n";
print_r($stus);
echo "\n\n执行反序列化";
$stb=unserialize($stus); //反序列化
echo "\n\n对象反序列化后的值:\n";
print_r($stb);
print "\n输出对象值:\n$stu";
//销毁几个对象,执行几次析构函数
?>
输出结果
原理
当程序在进行反序列化时,会自动调用一些函数,例如__wakeup(),__destruct()等函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。
利用
反序列化时unserialize()函数会自动调用wakeup(),destruct(),函数,当有一些漏洞或者恶意代码在这些函数中,当我们控制序列化的字符串时会去触发他们,从而达到攻击的目的。
删除文件
<?php
class LogFile
{
//日志文件名
public $filename = 'error.log';
//存储日志文件
function LogData($text)
{
//输出需要存储的内容
echo 'log some data:'.$text.'<br>';
file_put_contents($this->filename, $text,FILE_APPEND);
}
//删除日志文件
function __destruct()
{
//输出删除的文件
echo '析构函数__destruct 删除新建文件'.$this->filename;
//绝对路径删除文件
unlink(dirname(__FILE__).'/'.$this->filename);
}
}
$logfile = unserialize($_GET['logfile']);
//O:7:"LogFile":1:{s:8:"filename";s:9:"error.log";}
echo "<pre>";
var_dump($logfile);
?>
执行结果
发现正常删除,但如果我们修改参数,让其删除其他的文件呢?
写入文件
<?php
class chybeta
{
public $test = '123';
function __wakeup()
{
$fp = fopen("shell.php","w") ;
fwrite($fp,$this->test);
fclose($fp);
}
}
$class = @$_GET['test'];
print_r($class);
echo "</br>";
$class_unser = unserialize($class);
// 为显示效果,把这个shell.php包含进来
require "shell.php";
?>
防御
- 不要把用户的输入或者是用户可控的参数直接放进反序列化的操作中去。
- 在进入反序列化函数之前,对参数进行限制过滤。
边栏推荐
- Distributed Computing Experiment 4 Random Signal Analysis System
- 智能健身动作识别:PP-TinyPose打造AI虚拟健身教练!
- The sorting algorithm including selection, bubble, and insertion
- Quick tips for getting out of a single
- 金仓数据库 KDTS 迁移工具使用指南 (7. 部署常见问题)
- js异步变同步、同步变异步
- 布局管理器
- 【UE虚幻引擎】UE5实现动态导航样条线绘制
- 第一次用postgreSQL,想装主从,用的12.7 tar.gz版本。安装好后没在 share目录下找到样例配置recovery.conf.sample,是安装方式不对,还是路径不对?
- (三)DDD上下文映射图——老师,我俩可是纯洁的男女关系!
猜你喜欢
沃尔玛、阿里国际该如何做测评自养号?
预测性维护学习之路
IDEA引入类报错:“The file size (2.59 MB) exceeds the configured limit (2.56MB)
Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》
从底层看 Redis 的五种数据类型
智汇华云 | 华云软件定义网络 DCI介绍
【论文笔记】Delving into the Estimation Shift of Batch Normalization in a Network
DWB主题事实及ST数据应用层构建,220803,,
Distributed Computing Experiment 1 Load Balancing
给Unity Behavior Designer(Unity行为树) 的Can See Object 画圆锥辅助图
随机推荐
研究性学习专题 3_LL(1)语法分析设计原理与实现
大佬们,mysql里text类型的字段,FlinkCDC需要特殊处理吗 就像处理bigint uns
虚拟机没有USB网卡选项怎么解决
GBase 8c中怎么查询数据库配置参数,例如datestyle。使用什么函数或者语法呢?
金仓数据库 KDTS 迁移工具使用指南 (4. BS 版使用说明)
Interpretation of new features | MySQL 8.0 online adjustment REDO
【虚幻引擎UE】UE5基于Gltf加载插件实现gltf格式骨骼动画在线/本地导入和切换
DNS 查询原理详解—— 阮一峰的网络日志
线程和进程之间的区别
MMDetection finetune
redis分布式锁的实现
使用GBase 8c数据库的时候,遇到这种报错
oracle sql 多表查询
金仓数据库 KDTS 迁移工具使用指南 (7. 部署常见问题)
dalle:zero-shot text-to-image generation
并查集介绍和基于并查集解决问题——LeetCode 952 按公因数计算最大组件大小
B站回应HR称“核心用户都是Loser”、求职者是“白嫖党”:已被劝退
unity2D横版游戏教程7-敌人AI死亡效果
Distributed Computing Experiment 4 Random Signal Analysis System
第一次用postgreSQL,想装主从,用的12.7 tar.gz版本。安装好后没在 share目录下找到样例配置recovery.conf.sample,是安装方式不对,还是路径不对?