PHP原生类(1)

PHP原生类(1)

一.可遍历目录类:

1.Directorylterator 类

​ 该类提供了一个用于查看文件系统目录内容的简单接口。该类的构造方法将会创建一个指定目录的迭代器。

​ 因为Directorylterator类中存在一个魔术方法:__toString(),当执行到echo函数时,会自动触发该方法,输出指定目录里面经过排序之后的第一个文件名,举个例子:

$name=new DirectoryIterator("/");
echo $name;

因为这个类只会输出第一个文件名,所以很多时候都不会输出什么有用的信息,所以这里最好对$name对象进行遍历:


$dir=new DirectoryIterator("/");
foreach($dir as $tmp){
    echo($tmp.'
'
); }

​ 在说下一个用法之前提一下glob协议,glob:// 用于 查找匹配的文件路径模式,用法类似于正则表达,类似于

$a = new Directorylterator("glob:///路径*.php")

​ 之后就是配合该协议来寻找我们想要的文件路径:

$name = new DirectoryIterator("glob:///*php*");
echo $name;

​ 也可以通过目录穿越,确定一直文件的具体路径:

$name = new DirectoryIterator("glob://./././flag.txt");  //目录穿越
echo $name;

2.Filesystemlterator 类

​ Filesystemlterator类基本上和Directorlterator类一样,Filesystemlterator的用法也基本上和Directorlterator类相近,这两个类得关系是父类与子类得关系,用法依旧如下:

');
}

3.Globlterator 类

​ 通过名字可以看出这个类自带glob协议,所以可以不用再使用glob协议了,像是


$a = new GlobIterator("/");
echo $a;

二.文件读取类:

SplFileObject类:

​ 当用文件目录遍历到了敏感文件时,可以用SplFileObject类,同样通过echo触发SplFileObject中的__toString()方法。(该类不支持通配符,所以必须先获取到完整文件名称才行),而且这个方法只能读一行,需要读取多行内容则需要对获取的对象进行遍历,构造payload的方法很简单,就是:

$a = new SplFileObject("./filename.php");
foreach($a as $temp){
    echo ($temp."
"
); }

但是有个前提,那就是需要有echo或者例如“.”的可以将其当作字符串进行操作的函数或语句。

三.Error和Exception内置类:

1.可以利用Error/Exception进行xss:

​ 由于Error类中有个__toString(),当对象被当作一个字符串进行使用时进行默认调用。而且我们能对Error类中的参数进行控制,所以可以利用标签来实现xss。其中,除了echo会触发这个魔术方法之外,还有file_exist()也会判断为触发。

​ 例如一串代码:

$a = unserialize($_POST['value']);
echo $a;

想要通过这个代码进行xss,那么就可以通过构造payload来进行,新建一个脚本,写入如下代码:

$a = new Error("");
$b = urlencode(serialize($a));
echo $b;

之后将生成的payload通过post方式传入即可进行xss。

2.利用Error和Exception类进行md5()和sha1()绕过:

​ Error类可以传递两个参数,而其中,有个参数的不同则对象也不同,所以说这两个对象也就不相等,但是对于__toString()返回相同的md5和sha1加密后也相同,最后的数据也相同,所以可以利用这一点对md5()和sha1()进行绕过。

​ 由于在Error类和Exception类中有__toString()魔术方法,可以用于将异常或错误对象转换为字符串,简单举个例子:

$a = new Error("null",1);$b = new Error("null",1);
if($a==$b)
{
    echo '$a==$b';
}

​ 最后得到的结果为

a = = a== a==b

​ 这是一种情况,弱比较的情况,当遇到的是===或者!==呢?尝试下这个脚本:

$a = new Error("null",1);$b = new Error("null",1);
if($a!==$b && md5($a)===md5($b) && sha1($a)===sha1($b))
    echo "Success!"; 

最后成功输出了“Success!”,所以,可以通过这种方式来试图绕过md5()和sha1()这两个函数。

​ 不过,这里需要注意一点,那就是实例化这两个Error类时必须在同一行进行实例化,否则会出现因为行数不同而造成报错信息中的个别值不同,造成的比较之间的不同,另外,遇到$a !=== b 或者 b或者 b或者a != $b 这种情况,需要保证new Error(“null”,1)中的1的不同,否则无法绕过不等于这个比较。

​ 由于剩下的两个内置类于我而言稍微困难了一点,所以等我先简单接触过ssrf和xxe这两个漏洞之后再进行接下来的学习。

你可能感兴趣的:(php,网络安全,web安全,安全)