php中的原生类
目录遍历类
Directorylterator
只能列出目录文件名,不能读文件内容
作用:查看文件系统的目录
返回值:指定目录下的第一个文件名(一般情况下是.)
这个类会创建一个指定目录的迭代器
1 | |

遇到echo输出时会触发DirectoryIterator中的__toString()方法
DirectoryIterator::__toString方法
参数:此函数没有参数
返回值:返回当前DirectoryIterator类的文件名
1)查看全部文件名
需要用foreach遍历
1 | |

可以访问到这个目录下的所有文件
2)筛选出特定类型的文件
配合glob://协议筛选
1 | |
用* *进行筛选含有php的文件

3)一句话形式
1 | |

FilesystemIterator
GlobIterator
读取文件
SplFileObject
作用:可用于读指定文件内容,直接echo只能读一行
1 | |

1)用foreach遍历$content对象
1 | |

可删除文件的类
ZipArchive
https://www.php.net/manual/zh/class.ziparchive.php
作用:对文件进行压缩与解压缩处理
常用的魔术方法
| 魔术方法 | 作用 |
|---|---|
| ZipArchive::addEmptyDir | 添加一个新的文件目录 |
| ZipArchive::addFile | 将文件添加到指定zip压缩包中 |
| ZipArchive::addFronString | 添加新的文件同时将内容添加进去 |
| ZipArchive::close | 关闭ZipArchive |
| ZipArchive::open | 打开一个zip压缩包 |
| ZipArchive::aextracTo | 将压缩包解压 |
| ZipArchive::deleteIndex | 删除压缩包中的某一个(deleteIndex(0)代表删除第一个文件) |
ZipArchive::open
1 | |
这段代码可以用于打开一个ZIP压缩文件或者创建新的ZIP文件
string $filename
- 类型约束:string表示传入的参数必须是字符串类型
- 参数作用:指定要操作的ZIP文件的路径和文件名
int $flags = 0
- 类型约束:int表示传入的参数必须是整型
- 参数作用:指定打开ZIP文件的模式和行为,参数的默认值为0
- 常用可选常量:
- ZipArchive::CREATE:若指定文件不存在,则创建该文件,若存在直接打开
- ZipArchive::OVERWRITE:覆盖已存在的ZIP文件,即使文件已有内容也会清空后重新创建
- ZipArchive::RDONLY:以只读模式打开ZIP文件,无法对文件进行写入、添加内容等操作
- 可以用按位(|)组合多个选项
bool|int:返回值类型说明
ZipArchive::OVERWRITE可以把指定文件删除

按Ctrl再点ZipArchive可以跟进方法可以看到public const OVERWRITE = 8,在调用时也可以直接将$flags赋值为8

所以可以利用ZipArchive类调用open方法来删除目标主机上的文件

原来存在一个2.php文件
1 | |

运行后会删除指定的2.php
1 | |
将flags直接写成8也是一样的可以删除指定文件
反射类
什么是反射
反射是指在PHP运行状态中,扩展分析PHP程序,导出或提取出于类、方法、属性、参数等的详细信息,包括注释。
这种动态获取的信息以及动态调用对象的方法的功能称为反射API
API:应用程序端口
反射是操纵面向对象范型中元模型的API
PHP反射API由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互
ReflectionClass类
作用
- 分析类结构
获取类名、命名空间、文件路径、接口、父类、修饰符、注释等
- 访问成员
检索类的方法、属性、常量等信息
- 实例化对象
动态创建类的实例(支持绕过魔术方法)
- 操作访问控制
绕过private/protected成员的访问权限
ReflectionClass::__construct函数

测试代码1
1 | |

测试了原生类Exception,可以看到其中的类、属性、方法
测试代码2
flag.php文件:
1 | |
111.php文件:
1 | |

可以看到其中的方法、属性名
常用的魔术方法
https://www.php.net/manual/zh/book.reflection.php
| 魔术方法 | 作用 |
|---|---|
| ReflectionClass::__construct | 初始化ReflectionClass类 |
| ReflectionClass::export | 导出类 |
| ReflectionClass::getAttributes | 获取所有属性 |
| ReflectionClass::getConstant | 获取已定义的常量 |
| ReflectionClass::getConstructor | 获取类的构造函数 |
| ReflectionClass::getMethod | 获取类方法 |
| ReflectionClass::getMethods | 获取类方法的数组 |
| ReflectionClass::getName | 获取类名 |
| ReflectionClass::getProperties | 获取属性 |
Reflection类
| 魔术方法 | 作用 |
|---|---|
| Reflection::export | 导出 |
| Reflection::getModifierNames | 获取修饰符的名称 |
可进行XSS的类
Error类
适用版本:php7版本
Error类就是php的一个内置类用于自动自定义一个Error
内置方法:__toString() 可能存在XSS
魔术方法
| 魔术方法 | 作用 |
|---|---|
| Error::__construct | 初始化 error 对象 |
| Error::getMessage | 获取错误信息 |
| Error::getPrevious | 返回先前的 Throwable |
| Error::getCode | 获取错误代码 |
| Error::getFile | 获取错误发生时的文件 |
| Error::getLine | 获取错误发生时的行号 |
| Error::getTrace | 获取调用栈(stack trace) |
| Error::getTraceAsString | 获取字符串形式的调用栈(stack trace |
| Error::__toString | error 的字符串表达 |
| Error::__clone | 克隆 error |