前言:
前几天打CTF,遇见了一道这样的题
<?php $a = $_GET['a']; $b = $_GET['b']; echo new $a($b); ?>
显然,题中没有给出任何可利用的class,在一阵苦思冥想下找到了一些PHP的原生的类,成功解决了此题
查找文件的原生类:
DirectoryIterator:
该类可配合glob伪协议查找文件,它会创建一个指定目录的迭代器,当遇到echo输出时会触发Directorylterator中的__toString()方法,输出指定目录里面经过排序之后的第一个文件名。
例如:
Directorylterator(glob://*flag*)
FilesystemIterator:
这个继承了DirectoryIterator类,利用方法同上
GlobIterator:
通过名字可以看出来,这个具有global性质,可以搜索全局的文件,因此无需借助glob://伪协议
可直接使用:
GlobIterator(*flag*)
读取文件的原生类:
SplFileObject:
当我们通过可查找文件的原生类查找到敏感文件时可用此类,来读取敏感文件内的内容
该类同样通过echo触发SplFileObject中的__toString()方法。(该类不支持通配符,所以必须先获取到完整文件名称才行)
例如:
SplFileObject(flag.php)
但是直接加入文件的的话,它只会返回文件的第一行字符,如果想要返回文件全部内容的话须借助php://filter伪协议
例如:
SplFileObject(php://filter/read=convert.base64-encode/resource=flag.php)
总结:
打CTF还是要多学多练,在题目中所碰到的知识点千奇百怪,还是得多积累,坚持一天一道CTF题