当前位置:网站首页>反序列化漏洞
反序列化漏洞
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 1 Load Balancing
- 【论文笔记】Understanding Long Programming Languages with Structure-Aware Sparse Attention
- Interpretation of new features | MySQL 8.0 online adjustment REDO
- 8.2学习记录
- Distributed Computing Experiment 4 Random Signal Analysis System
- 金仓数据库 KDTS 迁移工具使用指南 (4. BS 版使用说明)
- 阿里云的数据库系统怎么升级更新的www.zgysffm.com怎么加快访问速度?
- Shared_preload_libraries导致很多语法不支持
- 【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解
猜你喜欢

Cross-species regulatory sequence activity prediction

从底层看 Redis 的五种数据类型

unittest使用简述

RT-Thread Studio学习(十二)W25Q128(SPI)的读写

Yolov5 replaces the backbone network of "Megvii Lightweight Convolutional Neural Network ShuffleNetv2"

IntelliJ新建一个类或者包的快捷键是什么?

spark算子讲解

最近的一些杂感-20220731

unity2D横版游戏教程7-敌人AI死亡效果

智汇华云 | 华云软件定义网络 DCI介绍
随机推荐
Libpq 是否支持读写分离配置
layout manager
速速脱单诀窍
通过GBase 8c Platform安装数据库集群时报错
学会 Arthas,让你 3 年经验掌握 5 年功力
金仓数据库 KDTS 迁移工具使用指南 (6. 注意事项)
js异步变同步、同步变异步
大佬们,mysql里text类型的字段,FlinkCDC需要特殊处理吗 就像处理bigint uns
Distributed Computing Experiment 1 Load Balancing
华为设备配置VRRP与NQA联动监视上行链路
JMeter 常用的几种断言方法,你会几种呢?
智汇华云 | 华云软件定义网络 DCI介绍
js - the first letter that appears twice
从底层看 Redis 的五种数据类型
IDEA引入类报错:“The file size (2.59 MB) exceeds the configured limit (2.56MB)
布局管理器
YOLOv5应用轻量级通用上采样算子CARAFE
[STM32] STM32F103 series name and package, memory
JNI学习1.环境配置与简单函数实现
【NOI模拟赛】纸老虎博弈(博弈论SG函数,长链剖分)
