我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP原生类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP原生类

什么是php原生类

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

我们可以通过脚本找一下php原生类

几个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() 方法,输出指定目录里面经过排序之后的第一个文件名

测试代码

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

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

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

');}

 

 FilesystemIterator

 基本和DirectoryIterator一样

GlobIterato

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

文件读取类 

SplFileObject

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

test1

key($this->value);    }}  unserialize($_GET['a']); ?>

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

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

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

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()

alert('1')");echo serialize($a);

 

 

 Excepthin 内置类 

适用于 php5,7

开启报错的情况下:

 exp

alert('1')");$b = serialize($a);echo urlencode($b);

也可以成功弹窗

命令执行

如果有eval的话就可以rce

  这就不限于Error函数了、

其他类

ReflectionMethod类

他本身具有的方法

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

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

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

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:关闭ziparchiveZipArchive::extractTo:将压缩包解压ZipArchive::open:打开一个zip压缩包ZipArchive::deleteIndex:删除压缩包中的某一个文件,如:deleteIndex(0)代表删除第一个文件ZipArchive::deleteName:删除压缩包中的某一个文件名称,同时也将文件删除

来源地址:https://blog.csdn.net/kuzemax/article/details/132144440

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP原生类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-09-05

PHP原生类怎么遍历

本篇内容主要讲解“PHP原生类怎么遍历”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP原生类怎么遍历”吧!首先贴一个遍历php内置类的脚本
2023-07-05

PHP反序列化原生类实例分析

这篇文章主要介绍“PHP反序列化原生类实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP反序列化原生类实例分析”文章能帮助大家解决问题。浅析php反序列化原生类的利用如果在代码审计或者ct
2023-06-30

PHP中常见原生类的使用总结

PHP原生类提供基本功能,提高代码的可读性、可维护性和性能。原生类包括数组、字符串、数字、日期和时间、I/O、异常等,可执行常见编程任务。使用原生类可确保标准化、增加可读性、优化性能。最佳实践包括选择正确类、充分利用功能、谨慎使用魔术方法和重载,并保持代码可读性。
PHP中常见原生类的使用总结
2024-04-02

简单实用的原生PHP分页类是怎样的

本篇文章为大家展示了简单实用的原生PHP分页类是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一款简单实用的原生PHP分页类,分页按钮样式简洁美观,页码多的时候显示“...”,也是挺多网站用的
2023-06-04

原生php pdo几个处理

闲来无事,便记录几个最近遇到的Pdo细节问题,平常都是用orm的。长连接在历史的Mysql驱动中,都是使用connect和pconnect来区分长短连接,到了pdo之后,改成了参数。PDO::ATTR_PERSISTENT $dbh = new PDO(MYS
2019-09-01

Ajax原生如何实现MIME类型

小编给大家分享一下Ajax原生如何实现MIME类型,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题描述下面的例子是一个Ajax的post请求的代码,这段代码在测
2023-06-08

JavaScript中有哪些原生错误类型

JavaScript中有哪些原生错误类型?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript的作用是什么1、能够嵌入动态文本于HTML页面。2、对
2023-06-14

PHP 云原生技术应用详解

云原生技术是一系列适用于云计算环境的实践和技术,旨在提高应用程序的可移植性、可扩展性和弹性。php中的云原生技术包括:docker:创建和运行容器。kubernetes:管理和编排容器。istio:服务网格,提供安全连接和流量管理。helm
PHP 云原生技术应用详解
2024-05-03

PHP云原生应用开发指南

云原生 php 开发指南介绍了使用 php 在云原生环境中开发应用程序的步骤:容器化:使用 docker 创建隔离的执行环境,打包应用程序及其依赖项。编排:使用 kubernetes 管理跨多台计算机上的容器化应用程序。自动缩放:使用 hp
PHP云原生应用开发指南
2024-05-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录