小迪安全46WEB 攻防-通用漏洞PHP 反序列化原生类漏洞绕过公私有属性

#知识点:

1、反序列化魔术方法全解

2、反序列化变量属性全解

3、反序列化魔术方法原生类

4、反序列化语言特性漏洞绕过

-其他魔术方法

-共有&私有&保护

-语言模式方法漏洞

-原生类获取利用配合 

#反序列化利用大概分类三类

-魔术方法的调用逻辑-如触发条件

-语言原生类的调用逻辑-SoapClient

-语言自身的安全缺陷-CVE-2016-7124

#反序列化课程点:

-PHP&Java&Python

序列化:对象转换为数组或字符串等格式

反序列化:将数组或字符串等格式转换成对象

serialize() //将一个对象转换成一个字符串

unserialize() //将字符串还原成一个对象

#PHP 反序列化漏洞

原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而

导致代码执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些

魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

#魔术方法利用点分析:

触发:

unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:

__construct(): //构造函数,当对象 new 的时候会自动调用

__destruct()//析构函数当对象被销毁时会被自动调用

__wakeup(): //unserialize()时会被自动调用

__invoke(): //当尝试以调用函数的方法调用一个对象时,会被自动调用

__call(): //在对象上下文中调用不可访问的方法时触发

__callStatci(): //在静态上下文中调用不可访问的方法时触发

__get(): //用于从不可访问的属性读取数据

__set(): //用于将数据写入不可访问的属性

__isset(): //在不可访问的属性上调用 isset


Ø 方法&属性-调用详解&变量数据详解

Ø CTF-语言漏洞-__wakeup()方法绕过

Ø CTF-方法原生类-获取&利用&配合其他


#方法&属性-调用详解&变量数据详解

对象变量属性:

public(公共的):在本类内部、外部类、子类都可以访问

protect(受保护的):只有本类或子类或父类中可以访问

private(私人的):只有本类内部可以使用

序列化数据显示:

private 属性序列化的时候格式是%00 类名%00 成员名

protect 属性序列化的时候格式是%00*%00 成员名

__destruct方法:

具体代码:

//__construct __destruct 魔术方法 创建调用__construct 2种销毁调用__destruct
class Test{public $name;public $age;public $string;// __construct:实例化对象时被调用.其作用是拿来初始化一些值。public function __construct($name, $age, $string){echo "__construct 初始化"."<br>";$this->name = $name;$this->age = $age;$this->string = $string;}// __destruct:当删除一个对象或对象操作终止时被调用。其最主要的作用是拿来做垃圾回收机制。//     * 当对象销毁时会调用此方法//    * 一是用户主动销毁对象,二是当程序结束时由引擎自动销毁//    *//*function __destruct(){echo "__destruct 类执行完毕"."<br>";}
}
// 主动销毁
$test = new Test("Spaceman",566, 'Test String');
unset($test);
echo '第一种执行完毕'.'<br>';
echo '----------------------<br>';
// 程序结束自动销毁
$test = new test("Spaceman",566, 'Test String');
echo '第二种执行完毕'.'<br>';

分析

__destruct:当删除一个对象或对象操作终止时被调用。其最主要的作用是拿来做垃圾回收机制    

一是用户主动销毁对象(unset),二是当程序结束时由引擎自动销毁

__toString方法

具体代码:

class Test
{public $variable = 'This is a string';public function good(){echo $this->variable . '<br />';}// 在对象当做字符串的时候会被调用public function __toString()
{return '__toString <br>';}
}$a = new Test();
$a->good();
//输出调用
echo $a;

在对象当做字符串的时候会被调用,即输出变量a——则表示以字符串的形式输出

__CALL方法:

具体代码:

class Test{public function good($number,$string){echo '存在good方法'.'<br>';echo $number.'---------'.$string.'<br>';}// 当调用类中不存在的方法时,就会调用__call();public function __call($method,$args){echo '不存在'.$method.'方法'.'<br>';var_dump($args);}
}$a = new Test();
$a->good(566,'nice');
$b = new Test();
$b->spaceman(899,'no');

调用某个方法, 若方法存在,则直接调用;若不存在,则会去调用__call函数。

__get()

具体代码:

class Test {public $n=123;// __get():访问不存在的成员变量时调用public function __get($name){echo '__get 不存在成员变量'.$name.'<br>';}
}$a = new Test();
// 存在成员变量n,所以不调用__get
echo $a->n;
echo '<br>';
// 不存在成员变量spaceman,所以调用__get
echo $a->spaceman;

读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数与__call方法类似,只不过是其对象属性

__set()方法

具体代码:

class Test{public $data = 100;protected $noway=0;// __set():设置对象不存在的属性或无法访问(私有)的属性时调用//__set($name, $value)// * 用来为私有成员属性设置的值// * 第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。public function __set($name,$value){echo '__set 不存在成员变量 '.$name.'<br>';echo '即将设置的值 '.$value."<br>";$this->noway=$value;}public function Get(){echo $this->noway;}
}$a = new Test();
// 读取 noway 的值,初始为0
$a->Get();
echo '<br>';
// 无法访问(私有)noway属性时调用,并设置值为899
$a->noway  = 899;
// 经过__set方法的设置noway的值为899
$a->Get();
echo '<br>';
// 设置对象不存在的属性spaceman
$a->spaceman = 566;
// 经过__set方法的设置noway的值为566
$a->Get();

设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数。

__sleep()方法:

具体代码:

class Test{public $name;public $age;public $string;// __construct:实例化对象时被调用.其作用是拿来初始化一些值。public function __construct($name, $age, $string){echo "__construct 初始化"."<br>";$this->name = $name;$this->age = $age;$this->string = $string;}//  __sleep() :serialize之前被调用,可以指定要序列化的对象属性public function __sleep(){echo "当在类外部使用serialize()时会调用这里的__sleep()方法<br>";// 例如指定只需要 name 和 age 进行序列化,必须返回一个数值return array('name', 'age');}
}$a = new Test("Spaceman",566, 'Test String');
echo serialize($a);

serialize之前被调用,可以指定要序列化的对象属性。

__wakeup方法:

具体代码:

class Test{public $sex;public $name;public $age;public function __construct($name, $age, $sex){$this->name = $name;$this->age = $age;$this->sex = $sex;}public function __wakeup(){echo "当在类外部使用unserialize()时会调用这里的__wakeup()方法<br>";$this->age = 566;}
}$person = new Test('spaceman',21,'男');
$a = serialize($person);
echo $a."<br>";
var_dump (unserialize($a));

Unserialize反序列化恢复对象之前调用该方法

__isset()方法

具体代码:

class Person{public $sex;private $name;private $age;public function __construct($name, $age, $sex){$this->name = $name;$this->age = $age;$this->sex = $sex;}// __isset():当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。public function __isset($content){echo "当在类外部使用isset()函数测定私有成员 {$content} 时,自动调用<br>";return isset($this->$content);}
}$person = new Person("spaceman", 25,'男');
// public 成员
echo ($person->sex),"<br>";
// private 成员
echo isset($person->name);

检测对象的某个属性是否存在时执行此函数。当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用

__unset()方法

具体代码:

class Person{public $sex;private $name;private $age;public function __construct($name, $age, $sex){$this->name = $name;$this->age = $age;$this->sex = $sex;}// __unset():销毁对象的某个属性时执行此函数public function __unset($content) {echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>";echo isset($this->$content)."<br>";}
}$person = new Person("spaceman", 21,"男"); // 初始赋值
echo "666666<br>";
unset($person->name);//调用 属性私有
unset($person->age);//调用 属性私有
unset($person->sex);//不调用 属性共有

在不可访问的属性(private)上使用unset()时触发

__INVOKE()

具体代码:

class Test{// _invoke():以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用public function __invoke($param1, $param2, $param3)
{echo "这是一个对象<br>";var_dump($param1,$param2,$param3);}
}$a  = new Test();
$a('spaceman',21,'男');

将对象当做函数来使用时执行此方法,通常不推荐这样做。

#私有和公有属性——案例
public(公共的):在本类内部、外部类、子类都可以访问

protect(受保护的):只有本类或子类或父类中可以访问

private(私人的):只有本类内部可以使用

序列化数据显示:

private 属性序列化的时候格式是%00 类名%00 成员名

protect 属性序列化的时候格式是%00*%00 成员名

具体代码:

class test{public $name="xiaodi";private $age="29";protected $sex="man";
}
$a=new test();
$a=serialize($a);
print_r($a);

将age改为public

所以通常对于序列化的数据,要进行一次编码,要考虑到%00的因素

#CTF-语言漏洞-__wakeup()方法绕过——案例

https://buuoj.cn/challenges

通过路径扫描,扫到一个www.zip的地址,访问便可进行下载去文件

此页面以GET方式select的变量接收,根据代码逻辑,得知__destruct方法在程序结束后被调用且password需等于100,__construct方法用new进行构造接收name和password 的值,__wakeup方法,在使用unserializ后自动调用,此时这里就出现了问题

我们要的是admin,而自动调用的是wakeup方法里的guest,那么就需想想wakeup方法该怎么绕过,通过历史漏洞得知——语言特性漏洞

靶场PHP版本符合

即将构造的序列化,变量个数改为3个,符合条件即可

(修改原理)

成功

#CTF-方法原生类-获取&利用&配合其他 

参考:浅析PHP原生类-安全客 - 安全资讯平台

版本会与原生类有直接的关系

-PHP有那些原生类-见脚本使用

Get.php

<?php
$classes = get_declared_classes();
foreach ($classes as $class) {$methods = get_class_methods($class);foreach ($methods as $method) {if (in_array($method, array('__destruct','__toString','__wakeup','__call','__callStatic','__get','__set','__isset','__unset','__invoke','__set_state'))) {print $class . '::' . $method . "\n";}}
} 

会将魔术方法里自带的类给打印出来

-常见使用的原生类-见参加案例

1.ctf-xss

从此代码可以猜测要用的方法可能是To_string,由于它的本身代码就只有这一点,那么无法通过其他对象进行触发To_string,故需要用原生类的To_string,通过get.php,可以得到相关的To_string对象

Exception对象

对其进行构造,并加入xss攻击

成功

2.Ctfshow259

由于此题的getflag();方法,不知道它的具体是什么才可触发,所以先把它姑且为不可访问的类型,也就是可被__call()、__get()所触发,

查看自身的原生类

对其进行搜索

找到构造payload(题目中要求,ip为127.0.0.1,token为ctfshow)

将flag.txt发送到本地

-原生类该怎么使用-见官方说明

0、生成原生类

补:phar、字符串逃逸

反序列化:自身不是漏洞,只是一种方法,在方法中会引发一些危险函数。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Backend - Echarts(柱状条形图)

一、下载并安装 &#xff08;一&#xff09;官网 https://echarts.apache.org/zh/index.html &#xff08;二&#xff09;下载依赖 1. 官网里选择下载方式 https://echarts.apache.org/handbook/zh/basics/download/ 2. 官网github方式下载 https://github.com/apache/echa…

如何利用AI助力你的工作,学会这些AI操作秘密,让AI给你打工赚钱

随着科技的进步,AI已逐渐融入我们日常生活的方方面面,成为提升工作效率、拓展个人能力的得力助手。在这个时代,不是AI替代我们,而是那些懂得利用AI的同事将更具竞争力。学会让AI为你“打工”,不仅能够节省时间、提升效率,还能帮助我们发现新机会,实现创新。 AI的优势…

数据结构——认识二叉树

这是一篇回顾二叉树概念的文章 前言&#xff1a;一、了解树形结构1.2 树的定义2.2 树的相关概念2.2 树的表示形式 二、了解二叉树结构和性质2.1 什么是二叉树&#xff1f;2.2 二叉树的性质2.3 二叉树的遍历2.3 二叉树的应用范围2.5 二叉树的优缺点 三、掌握二叉树的存储结构3.1…

关闭 Microsoft Word 2010 配置窗口

关闭 Microsoft Word 2010 配置窗口 References 出现这种问题&#xff0c;主要是安装时所用账户和目前登陆的账户不为同一个账户造成的。或者你进行过覆盖安装或是重新安装过系统&#xff0c;但是 office 的安装目录没有更改。先激活 Microsoft Office&#xff0c;然后执行下列…

springcloud第4季 负载均衡的介绍3

一 loadbalance 1.1 负载均衡的介绍 使用注解loadbalance&#xff0c;是一个客户端的负载均衡器&#xff1b;通过之前已经从注册中心拉取缓存到本地的服务列表中&#xff0c;获取服务进行轮询负载请求服务列表中的数据。 轮询原理 1.2 loadbalance工作流程 loadBalance工作…

-bash: ./1.sh: /bin/bash^M: bad interpreter: No such file or directory解决方法

1、执行脚本 ./1.sh时报如下错误 -bash: ./1.sh: /bin/bash^M: bad interpreter: No such file or directory 2、在Windows编辑的脚本导入Linux系统中&#xff0c;执行报错问题 yum install -y dos2unix 3、或者本地安装 rpm -ivh /mnt/Packages/dos...... 4、然…

opencv各个模块介绍(1)

Core 模块&#xff1a;核心模块&#xff0c;提供了基本的数据结构和功能。 常用的核心函数&#xff1a; cv::Mat&#xff1a;表示多维数组的数据结构&#xff0c;是OpenCV中最常用的类之一&#xff0c;用于存储图像数据和进行矩阵运算。 cv::Scalar&#xff1a;用于表示多通道…

Python综合实战案例-数据清洗分析

写在前面&#xff1a; 本次是根据前文讲解的爬虫、数据清洗、分析进行的一个纵隔讲解案例&#xff0c;也是对自己这段时间python爬虫、数据分析方向的一个总结。 本例设计一个豆瓣读书数据⽂件&#xff0c;book.xlsx⽂件保存的是爬取豆瓣⽹站得到的图书数据&#xff0c;共 6067…

瑞芯微RK3576|触觉智能:开启科技新篇章

更多产品详情可关注深圳触觉智能官网&#xff01; “瑞芯微&#xff0c;创新不止步&#xff01;”——全新芯片RK3576即将震撼登场。指引科技风潮&#xff0c;创造未来无限可能&#xff01;这款芯片在瑞芯微不断创新和突破的道路上&#xff0c;不仅是对过往成就的完美延续&…

填补市场空白,Apache TsFile 如何重新定义时序数据管理

欢迎全球开发者参与到 Apache TsFile 项目中。 刚刚过去的 2023 年&#xff0c;国产开源技术再次获得国际认可。 2023 年 11 月 15 日&#xff0c;经全球最大的开源软件基金会 ASF 董事会投票决议&#xff0c;时序数据文件格式 TsFile 正式通过&#xff0c;直接晋升为 Apache T…

基于傅里叶描述子的手势动作识别,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

AI之Suno:Suno V3的简介、安装和使用方法、案例应用之详细攻略

AI之Suno&#xff1a;Suno V3的简介、安装和使用方法、案例应用之详细攻略 目录 Suno AI的简介 1、特点与改进&#xff1a; Suno AI的安装和使用方法 1、第一步&#xff0c;让国产大模型—ChatGLM4帮我写一个提示词 2、第二步&#xff0c;将提示词交给Suno v3&#xff0c;…

阿里云倚天服务器是什么?倚天服务器c8y、g8y和r8y详细介绍

阿里云倚天云服务器CPU采用倚天710处理器&#xff0c;租用倚天服务器c8y、g8y和r8y可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持&#xff1a; 阿里云倚天云服务…

FastAPI+React全栈开发02 什么是FARM技术栈

Chapter01 Web Development and the FARM Stack 02 What is the FARM stack and how does it fit together? FastAPIReact全栈开发02 什么是FARM技术栈 It is important to understand that stacks aren’t really special, they are just sets of technologies that cover…

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制&#xff0c;包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏&#xff0c;非待机&#xff0c;并黑屏后点击触摸屏可以唤醒屏幕&#xff0c;可以借助 xrandr 命令来实现。 首先&#xff0c;…

docker 本地机 互通文件

查询容器name 查询容器Id 进行传输

从相机空间到像素空间的投影和反投影原理和代码

目录 从相机空间到像素空间的投影 效果 ​编辑 公式 ​编辑 代码 像素空间到相机空间的反投影 记录一下从相机空间到像素空间的投影&#xff08;3D-->2D&#xff09;和像素空间到相机空间的反投影&#xff08;2D-->3D&#xff09;。 推荐blog&#xff1a;SLAM入门之视…

WSL下Ubuntu+RTX4090安装CUDA+cuDnn+Pytorch

安装驱动 首先需要明确的是&#xff0c;在WSL下安装Ubuntu&#xff0c;如果要使用主机的GPU卡&#xff0c;只需要在主机Windows上安装驱动&#xff0c;Linux中不需要安装驱动&#xff0c;可以在Linux中使用nvidia-smi命令查看驱动版本。 安装CUDA 避坑注意事项&#xff1a;如…

【框架】说一说 Fork/Join?

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习Java框架 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助 目录 前言 什么是 Fork&#xff1f; 什么是 Join&#xff1f; Fork/Join 的核心组件 F…

流畅的 Python 第二版(GPT 重译)(二)

第三章&#xff1a;字典和集合 Python 基本上是用大量语法糖包装的字典。 Lalo Martins&#xff0c;早期数字游牧民和 Pythonista 我们在所有的 Python 程序中都使用字典。即使不是直接在我们的代码中&#xff0c;也是间接的&#xff0c;因为dict类型是 Python 实现的基本部分。…