MipCms后台getshell

先看前台一个模版包含,通过id从数据库中查询出template
/app/article/controller/Article.php

$id = input('param.id');
if ($id) {
            $categoryInfo = model($this->itemCategoryModelNameSpace)->getCategoryInfo($id);
            if (!$categoryInfo) {
                $this->error('分类不存在','');
            }
            $currentCid = $categoryInfo['id'];
        }
        
...
  
        $templateName = $categoryInfo['template'] ? $categoryInfo['template'] : $this->itemType;
        $templateName = str_replace('.html', '', $templateName);
        
        return $this->mipView($this->itemType. '/' .$templateName);

在看修改template部分代码
/app/article/controller/ApiAdminArticleCategory.php

  public function categoryAdd()
    {
        $data = $this->request->post();
        if (!$data['name']) {
            return jsonError('请输入名称');
        }
        if (!$data['url_name']) {
          return jsonError('请输入URL别名');
        }
        $itemCategoryInfo = db($this->itemCategory)->where('name',$data['name'])->find();
        if ($itemCategoryInfo) {
            return jsonError('添加项已存在');
        }
        $itemInfo = db($this->itemCategory)->where('url_name',$data['url_name'])->find();
        if ($itemInfo) {
            return jsonError('别名已存在,请重新输入');
        }
        $res = model($this->itemCategoryModelNameSpace)->categoryAdd($data);
        if ($res) {
            return jsonSuccess('操作成功');
        } else {
            return jsonError('操作失败');
        }
    }

通过上述代码可以发现直接把post数据给caltegory去添加了,那么就可以操作任意的列,正常添加的post数据如下

{
  "id": 1,
  "pid": 0,
  "name": "test",
  "url_name": "test",
  "seo_title": "",
  "template": "xxx",
  "detail_template": "articleDetail.html",
  "category_url": "/article/<url_name>/",
  "category_page_url": "<category_url>index_<page>.html",
  "detail_url": "/article/<id>.html",
  "description": "",
  "keywords": "",
  "is_page": "0",
  "content": ""
}

其中template就是我们可以控制的字符,就可以达到修改template包含任意html文件的目的,那么我们还需要一个写入任意html的点。

/addons/collectHuochetou/controller/ApiUserCollectHuochetou.php
这里就可以看前台一个采集插件,

public function articleAdd(Request $request) {
...
try {
                        $htmlInfo = db('Addons')->where('name','html')->find(); //需要开启了html插件
                        if ($htmlInfo) {
                            $url = config('domainStatic').'/index.php?s='; 
                            //获取数据库中的domain并访问指定页面然后写入根目录的index.html
                            $html = getData($url);
                            $path = MIP_ROOT . 'index.html';
                            file_put_contents($path, $html);
                            
                    } catch (\Exception $e) {}
                    //插件-文章静态化结束
                    //以下为发布成功标识
                    return jsonSuccess('发布成功',$result);

}

但是在这个程序中后台并没有一个插件叫html。。陷入了僵局。。后来发现后台可以添加远程数据库作为新的站点,(无后台代码,只有前台代码)

即通过绑定了一个远程的前台数据库,然后修改addons,增加一个html插件

那么需要控制domain指向我们的webshell,好让他生成我们可以控制的页面的html,已经有数据库权限了,只需要修改setting表中的articleDomain即可实现。

然后在修改template实现本地包含

标签: none