代码编织梦想

反序列化漏洞

0x01. 序列化和反序列化是什么

序列化:变量转换为可保存或传输的字符串的过程;
反序列化:把序列化的字符串再转化成原来的变量使用
作用:可轻松地存储和传输数据,使程序更具维护性

0x02. 为什么会有序列化

序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构

0x03. 序列化和反序列化代码示例

<?php
class User
{
    public $username = 'admin';
    public $password = '123456';
}
// 序列化操作
$user = new User();
$str_ser = serialize($user);
echo "序列化结果为:\n";
var_dump($str_ser);
echo "反序列化结果为:\n";
// 反序列化操作
$str_uns = 'O:4:"User":2:{s:8:"username";s:5:"admin";s:8:"password";s:6:"123456";}';
$str = unserialize($str_uns);
var_dump($str);
?>

运行结果:
在这里插入图片描述
序列化后的格式如下:
在这里插入图片描述

0x04. 魔术方法

魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)

1.__construct,__destruct

__constuct构建对象的时被调用;
__destruct明确销毁对象或脚本结束时被调用;

2.__get,__set

__set当给不可访问或不存在属性赋值时被调用
__get读取不可访问或不存在属性时被调用

3.__isset,__unset

__isset对不可访问或不存在的属性调用isset()empty()时被调用
__unset对不可访问或不存在的属性进行unset时被调用

4.__sleep,__wakeup

__sleep当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
__wakeup当使用unserialize时被调用,可用于做些对象的初始化操作

0x05. 反序列化漏洞成因

当传给 unserialize() 的参数可控时,那么就可以注入精心构造的payload,而当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成恶意命令执行!

0x06. 反序列化漏洞举例
(1)测试代码如下:

<?php
header("Content-Type:text/html;charset=utf-8");
class vFREE{
public $name='vFREE';
public $age='18';
function __wakeup(){
$this->age = "18";
echo("执行了wakeup魔术方法<br>");
}
function __destruct(){
echo("执行了destruct魔术方法");
$path='flag.php';
$file_get=file_put_contents($path,$this->name);

}
}
$flag = $_GET['flag'];
$unser = unserialize($flag);
?>

解释:类外部用到了反序列化函数unserialize,但用到这个函数时,就会像检查类vFREE中有没有__wakeup方法,有的话就执行,没有就跳过,很明显,代码中有wakeup,但是wakeup的内容就是一个赋值操作,并起不了太大的作用,反而destruct中可以利用一波,因为destruct中打开一个flag.php的文件,然后将$this->name的值作为内容写入到flag.php中,假如我们写入一个木马,便可以Getshell

(2)我们要传入一个参数flag,并且将传入的值放入反序列化函数中执行,所以我们要传入的应该是一个序列化后的字符串,此时我们应该类vFREE进行序列化,代码如下:

<?php 
class vFREE{
    public $name='vFREE';
    public $age='18';

    function __wakeup(){
    $this->age = "18";
                        }
    function __destruct(){
    $path='flag.php';
    $file_get=file_put_contents($path,$this->name);
                         }
    }

$test = new vFREE();   
$str = serialize($test);
var_dump($str);
?> 
得到序列化后的结果:O:5:"vFREE":2:{s:4:"name";s:5:"vFREE";s:3:"age";s:2:"18";}

在这里插入图片描述
(3)绕过wakeup方法:

绕过wakeup方法,直接执行destruct写入shell:
更改原有属性值达到绕过过wakeup的效果,此时的类中属性值是2,我们只要将属性值改为大于2,即可绕过,如下改成5,便可以绕过:

O:5:"vFREE":5:{s:4:"name";s:18:"<?php phpinfo();?>";s:3:"age";s:2:"18";}

(4)传入恶意payload,成功创建flag.php
在这里插入图片描述
在这里插入图片描述

(5)查看生成的flag.php,利用成功

在这里插入图片描述

0x07. 反序列化漏洞预防

1)安全配置好php相关参数
通过Php配置文件里面有个disable_functions = 配置
这个禁止某些php函数,服务器便是用这个来禁止php的执行命令函数
 #禁止这些函数来执行系统命令
例:disable_functions =system,passthru,shell_exec,exec,popen  
(2)严格控制传入变量,严谨使用魔法函数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42383069/article/details/124841251

php在window下安装xhprof扩展环境说明:_tboqi1的博客-爱代码爱编程

php:php7.3.4nts (phpstudy_pro集成环境中的php) xhprof:php_xhprof-2.2.3-7.3-nts-vc15-x64 window 10 64位 1、同时下载DLL和TGZ dll/tgz:https://pecl.php.net/package/xhprof 选择【stable】的即可,【beta】不稳定

php第三章:1.流程控制;if分支结构、switch分支结构_许我葳蕤的博客-爱代码爱编程

总览 1.顺序结构:代码正常执行 2.分支结构:根据条件执行 3.循环结构:根据条件重复执行一段代码 一、if分支 1.分支结构包括: if 分支结构:if - if else - if elseif switch 分支结构 2.if 分支结构 · 代码演示: <?php if(true){ echo "hello

做一个destoon输出json的api,用于数据调用_luo2424348224的博客-爱代码爱编程

   把destoon数据生成json,一般用于百度小程序、QQ小程序和微信小程序或者原生APP,由于系统是GB2312编码,所以服务端编写的时候我们进行了一些编码转换的处理,保证服务端访问的编码是UTF-8就可以。不多了,下面干货来了。如果你是程序或此段代码对你有帮助,希望收藏!! 代码来了,在根目录新建一个文件夹,如appapi ,在其下面建一

本地搭建wordpress个人博客,并内网穿透发布上线 (19)_cpolarlisa的博客-爱代码爱编程

在前面的文章中,我们为大家详细介绍了如何从域名供应商处,购买一个自己喜欢的域名。但此时购买的域名未经过解析,还没有与我们本地电脑上的网页关联起来,因此我们接下来要做的设置,就是对这个域名进行解析,让其能与我们本地的网页相关联,使公共互联网的访客能够通过域名链接到本地的WordPress网站。 要让我们购买的域名,能够链接到本地电脑上的网页,我们需要对购买

【php】php读取csv文件_田辛 | 田豆芽的博客-爱代码爱编程

PHP读取CSV文件 写作时间:2022-05-17 作者:田辛 1 摘要 PHP有读取CSV文件内容并保存在数组中的函数“fgetcsv”。使用fgetcsv函数可以轻松读取CSV文件。 本文介绍了使用fgetcsv函数读取CSV文件的方法。 2 缘起 最近,田老师打算完成微信和支付宝交易流水的导入功能(这里是个人账单)。 目前微信和

php变量作用域_qq_42307546的博客-爱代码爱编程

<?php $name = 123; function test(){ $name = 456;//在函数内部无法在外部被调用 } test(); echo $name;//结果为123 ?> <?php $name = 123; function test(){ global $name;//声明为全局变量在整个脚本都可以使

kali渗透测试:使用metasploit对web应用的攻击_m0_54861649的博客-爱代码爱编程

Kali渗透测试:使用Metasploit对Web应用的攻击 Web应用程序的漏洞数量众多,这里我们以其中一个命令注入漏洞为例复现一下。这种漏洞源于Web应用程序没有对用户输入的内容进行准确的验证,从而导致操作系统执行了攻击者输入的命令。下面是一段运行在Metasploitable2靶机上的PHP脚本,它来自于DVWA,代码如下: <html&g

源码编译安装lamp_醉凡尘¢ world1y的博客-爱代码爱编程

目录 前言 一、源码编译的应用? 二、LAMP概述 2.1 Apache简介 2.1.1  Apache起源 2.1.2 主要特点 2.1.3  软件版本 2.1.4 Apache工作原理 2.2  LAMP平台概述 2.3  构建LAMP平台顺序 2.4  编译安装的优点 2.5  各组件的主要作用 ​编辑  2.6 http

部署 lamp平台linux,apache,mysql ,php源码编译安装_lichenboke的博客-爱代码爱编程

目录 引言: 一、LAMP概述 1、各组件作用 2、各组件安装顺序 3.数据流向 二、编译安装Apache httpd服务 1.关闭防火墙,将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径,并把httpd服务的可执行程序文件放入路径环境变量的目录中便于系统识别

web服务之lamp架构、部署论坛_ys974386的博客-爱代码爱编程

目录 一、LAMP简介与概述 1、LAMP平台概述 2、构建LAMP平台顺序 3、编译安装的优点 4、各组件的主要作用 二、编译安装Apache 三、编译安装MySql 四、编译安装PHP 五、安装论坛 一、LAMP简介与概述 1、LAMP平台概述         LAMP架构是目前成熟的企业网站应用模式之一,指的是

wordpress评论插件wpdiscuz任意文件上传漏洞(cve-2020-24186)_1erkeu的博客-爱代码爱编程

CVE-2020-24186 WordPress评论插件wpDiscuz任意文件上传漏洞 漏洞介绍 Wordfence的威胁情报团队在一款名叫wpDiscuz的Wordpress评论插件(wpDiscuz是WordPress功能丰富的评论系统插件,可充实网站评论部分)中发现了一个高危漏洞,此漏洞将允许未经认证的攻击者在目标站点中上传任意文件,从而实

前端好用的几款富文本插件_脑瓜不疼的博客-爱代码爱编程

文章目录 一、 wangEditor二、TinyMCE三、百度ueditor四、kindeditor五、Textbox 一、 wangEditor 开源 Web 富文本编辑器,开箱即用,配置简单 github: https://github.com/wangeditor-team/wangEditor star⭐️ 13.6k 文

《宝塔面板教程7》:如何修改宝塔面板默认端口号_云tech的博客-爱代码爱编程

装过宝塔面板的朋友都知道,默认的宝塔面板登录端口号为8888,如果我们修改的话,那么大家都会知道你的登录端口号。无疑增加了网站被攻击的风险。因此建议大家都修改一下宝塔面板默认的登录端口号8888。 没有安装宝塔面板或者不会搭建网站的,可以先看下面简单易懂的教程:点击查看:《宝塔面板教程1》:宝塔面板安装命令及安装要求点击查看:《宝塔面板教程2》:如何获取宝

wordpress文章类型函数:register_post_type()_水月薪族的博客-爱代码爱编程

这个函数主要是用在wordpress后台用与自定义文章类型的,使用后可以在wordpress后台单独增加一个分类,可以在此分类下发表文章。这里指的是添加一个分类,若是要调取分类用这个。 语法 register_post_type($post_type,$args) 参数 $post_type (string) (必选) 文章类型的名称(最多20

【每天更新】2022年最新wordpress主题下载,外贸独立站商城/企业网站/个人博客模板 2022-5-18_谷哥学术的博客-爱代码爱编程

WordPress主题名称WordPress主题下载地址WordPress主题:Belinni v1.5.1Multiconcept博客 杂志主题2022年最新版.zipWordPress主题:Belinniv1.5.1Multiconcept博客杂志主题2022年最新版.zip-Typescript文档类资源-CSDN下载WordPress主题:Even

《专业四》第一单元练习手册_优秀的磊少的博客-爱代码爱编程

一、练习目标: 掌握面向对象编程中PHP类使用掌握方法和属性分别在类内、类外如何调用掌握静态属性和常量的使用二、练习题: 练习题一:PHP类的基本创建、调用考察 完成时间:20分钟 场景描述: 在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整

使用docker安装hyperf(ubuntu)_太阳上的雨天的博客-爱代码爱编程_docker 安装hyperf

使用docker安装hyperf(ubuntu) 下载并运行 hyperf/hyperf 镜像,并将镜像内的项目目录绑定到宿主机的 /tmp/skeleton 目录 docker run -v /tmp/skeleton:/hyperf-skeleton -p 9501:9501 -it --entrypoint /bin/sh hyperf/hype