首页 > 其他分享 >9-16cms审计

9-16cms审计

时间:2022-10-02 10:57:52浏览次数:35  
标签:审计 文件 name request 16cms upload action php


title: 9.16cms审计
date: 2022-09-16 20:28:36
tags:

这里面学到了一点

之前一直以为图片码的利用方式只有包含图片码才可以利用 (因为include函数会自动的把文件当作php文件来解析) 这里重点是当作php文件来解析 所以 只要能是图片被解析成php文件格式 就可以利用图片码

通过_empty函数

    public function _empty($name)
    {
        $data = Hook::listen("user_request_empty", $name);
        foreach ($data as $index => $datum) {
            $this->view->assign($datum);
        }
        return $this->view->fetch('user/' . $name);
    }

这里参数为name

这里进入 Hook::listen函数看一看

    public static function listen($tag, &$params = null, $extra = null, $once = false)
    {
        $results = [];
        //user_request_empty
        foreach (static::get($tag) as $key => $name) {
            //name为键值  tag为user_request_empty  null  null
            $results[$key] = self::exec($name, $tag, $params, $extra);

            // 如果返回 false,或者仅获取一个有效返回则中断行为执行
            if (false === $results[$key] || (!is_null($results[$key]) && $once)) {
                break;
            }
        }

        return $once ? end($results) : $results;
    }

经过分析返回为空、

但是无所谓

这里取模板渲染user/$name

$name是我们可控的所以我们可以包含一个图片把它当成php文件来执行

这里上传一个图片码

直接渲染这个图片码即可

image-20220915221530326

这里有文件路径

image-20220915221850120

看 api应用 common控制器

有个uplaod函数是上传功能的函数

    public function upload()
    {
        Config::set('default_return_type', 'json');
        //必须设定cdnurl为空,否则cdnurl函数计算错误
        Config::set('upload.cdnurl', '');
        $chunkid = $this->request->post("chunkid");
        if ($chunkid) {
            if (!Config::get('upload.chunking')) {
                $this->error(__('Chunk file disabled'));
            }
            $action = $this->request->post("action");
            $chunkindex = $this->request->post("chunkindex/d");
            $chunkcount = $this->request->post("chunkcount/d");
            $filename = $this->request->post("filename");
            $method = $this->request->method(true);
           // var_dump($action);
            //var_dump($method);
            if ($action == 'merge') {
                $attachment = null;
                //合并分片文件
                try {
                    $upload = new Upload();
                    //进入merge函数 并且参数是可控的
                    $attachment = $upload->merge($chunkid, $chunkcount, $filename);
                } catch (UploadException $e) {
                    $this->error($e->getMessage());
                }
                $this->success(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);
            } elseif ($method == 'clean') {

                //删除冗余的分片文件
                try {
                    $upload = new Upload();
                    $upload->clean($chunkid);
                } catch (UploadException $e) {
                    $this->error($e->getMessage());
                }
                $this->success();
            } else {
                //phpinfo();
                //上传分片文件
                //默认普通上传文件
                //上传文件
                $file = $this->request->file('file');
                try {
                    //实例化upload类
                    $upload = new Upload($file);
                    //进入uplaod chunk方法  参数都是可控的
                    $upload->chunk($chunkid, $chunkindex, $chunkcount);
                } catch (UploadException $e) {
                    $this->error($e->getMessage());
                }
                $this->success();
            }
        } else {
            $attachment = null;
            //默认普通上传文件
            $file = $this->request->file('file');
            try {
                $upload = new Upload($file);
                $attachment = $upload->upload();
            } catch (UploadException $e) {
                $this->error($e->getMessage());
            }

            $this->success(__('Uploaded successful'), ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);
        }

    }
}
            $action = $this->request->post("action");
            $chunkindex = $this->request->post("chunkindex/d");
            $chunkcount = $this->request->post("chunkcount/d");
            $filename = $this->request->post("filename");

这些参数都是可控的

先进入分片模式上传文件

image-20220916141325802

进入chunk方法 这里面支队文件mime类型进行了判断 所以我们可以轻松绕过

然后进入

合并分片方法中合并图片 最后返回路径

因为这里对分片模式的检查不够严格所以我们可以绕过

dedecms

后台rce

漏洞代码在

dede/sys_verifies.php

这里面的

else if ($action == 'getfiles')
{
    //phpinfo();
    if(!isset($refiles))
    {
        ShowMsg("你没进行任何操作!","sys_verifies.php");
        exit();
    }
    /*var_dump($action);
    var_dump($refiles);*/
    //var_dump($refiles);
    $cacheFiles = DEDEDATA.'/modifytmp.inc';
    var_dump($cacheFiles);
    //"ac501d8e0834f8e5
  //  var_dump($tmpdir);
    $fp = fopen($cacheFiles, 'w');
    //<?php
    //$tmpdir=""ac501d8e0834f8e5";
    //$files['1']="<";
    fwrite($fp, '<'.'?php'."\r\n");
    fwrite($fp, '$tmpdir = "'.$tmpdir.'";'."\r\n");
    $dirs = array();
    $i = -1;
    $adminDir = preg_replace("#(.*)[\/\\\\]#", "", dirname(__FILE__));
    foreach($refiles as $filename)
    {
        //
        //从第四个字符开始,返回直到倒数第三个
        $filename = substr($filename,3,strlen($filename)-3);
        if(preg_match("#^dede/#i", $filename)) 
        {
            $curdir = GetDirName( preg_replace("#^dede/#i", $adminDir.'/', $filename) );
        } else {
            $curdir = GetDirName($filename);
        }
        if( !isset($dirs[$curdir]) ) 
        {
            $dirs[$curdir] = TestIsFileDir($curdir);
        }
        $i++;
        //$files['1']=""";
        //
        var_dump($filename);
        fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n");
    }
    fwrite($fp, '$fileConut = '.$i.';'."\r\n");
    fwrite($fp, '?'.'>');
    fclose($fp);
    
    $dirinfos = '';
    if($i > -1)
    {
        $dirinfos = '<tr bgcolor="#ffffff"><td colspan="2">';
        $dirinfos .= "本次升级需要在下面文件夹写入更新文件,请注意文件夹<font color='red'>是否有写入权限:</font><br />\r\n";
        foreach($dirs as $curdir)
        {
            $dirinfos .= $curdir['name']." 状态:".($curdir['writeable'] ? "[√正常]" : "<font color='red'>[×不可写]:请创建该目录</font>")."<br />\r\n";
        }
        $dirinfos .= "</td></tr>\r\n";
    }
        
    $doneStr = "<iframe name='stafrm' src='sys_verifies.php?action=down&curfile=0' frameborder='0' id='stafrm' width='100%' height='100%'></iframe>\r\n";
    
    include(DEDEADMIN.'/templets/sys_verifies_getfiles.htm');
    
    exit();
}

这个分支里面、

image-20220916180905603

这个如果action为空的话

就包含这个html文件

进入这个html文件

image-20220916181002012

这个可以控制action和filename

继续回到dede/sys_verifies.php这个页面

我们控制action为getfiles

然后由于我们是由源码的 不用具体的看

image-20220916181144484

随便写个东西 只要他不回显 就没有进入这个if分支

还是这样var_dump直接显示出文件的路径

然后可以向文件中写入内容

其实我注释里面页写入了一些东西(分析的过程)、

这里它自动给写了

    <?php
    $tmpdir=""ac501d8e0834f8e5";

php文件头 我们只需要在里面写入shell就可以了

但是

这里框架做了全局过滤
然后我们看一下是怎么进项过滤的

我们写shell的时候就这个addslashes进行了过滤 因为我们要闭合上面的引号

但是这个函数对"进行了转义

但是 这里又有一行代码

$filename = substr($filename,3,strlen($filename)-3);

它竟然把前三个字符给截取掉了

不知道开发者写这个功能是干什么用的

是想截取掉我们上传的<?php ?

我想不通 不过不重要 这里我们可以写入

/"

然后经过addslashes函数过滤之后就会形成这个样子

image-20220916182111256

它里面有把前三个字符截取掉了

所以这样经过截取前三个字符之后就会只剩下一个"这样我们就可以闭合双引号 拼接php代码了

直接拼接shell就可以了 因为这个不是php文件所以我们可以找到利用包含 让他当作php文件来解析就可

这里面就有包含这个文件

image-20220916182525529

所以就可rce了

image-20220916182547749

标签:审计,文件,name,request,16cms,upload,action,php
From: https://www.cnblogs.com/kkkkl/p/16748377.html

相关文章

  • BUUCTF web 第二题代码审计
    BUUCTFweb2[极客大挑战2019]WarmUp代码审计✔解题方法1.查看网页源代码<htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content=......
  • 【安全测试】【fortify】【源码审计】windows下源码审计fortify安装及使用
    一、fortify安装(非商用,仅学习使用)1.解压安装包2.双击exe文件进行安装,下一步即可,直至完成  3.exe安装完成后,将下图三个文件拷贝到安装目录下的Core\config下替换 ......
  • 代码审计(Java)——WebGoat_InsecureDeserialization
    level-5找到java文件,可以看到传入的token经过64解码后输入导对象输入流中,然后没有加限制直接readObject进行了反序列化操作,确实存在漏洞点~packageorg.owasp.web......
  • 认证、授权、审计AAA-Authentication Authorization Accounting
    一、AAA的基本概念 AAA是网络安全的一种管理机制,提供了认证、授权、审计三种安全功能:Authentication认证:对用户的身份进行认证。 你是谁?Authorization授权:认证之后......
  • .NET代码审计之WebService安全
    背景是微信群里有伙伴问起asmx接口怎么测试,其实和其他语言的API接口一样,每一条接口都有可能存在SQL注入、XXE、文件读取写入等风险,代码审计时需关注扩展名为.asmx的文件。......
  • PHP代码审计——文件操作漏洞
    梦想CMS(lmxcms)任意文件删除1.漏洞详情——CNVD-2020-59469 2.漏洞描述称后台Ba***.cl***.php文件存在任意文件删除,查看cms源码,只有BackdbAction.class.php和Basic......
  • MariaDB配置日志审计
    MariaDB配置日志审计1.确认日志审计插件首先确认插件路径,执行下列SQL确认:MariaDB[(none)]>SHOWGLOBALVARIABLESLIKE'plugin_dir';+---------------+------------......
  • java代码审计的点
    java代码审计的点组件的审计首先看pom.xml查看第三方组件和第三方组件的版本常用的第三方组件:第三方组件漏洞类型组件漏洞版本log4j2远程代码执行Apachel......
  • 简单的java代码审计
    描述很简单的代码审计java安全——Fastjson反序列化java安全——SQL注入Fastjson反序列化首先看一下配置文件,对于Maven项目,我们首先从pom.xml文件开始审计引入的第......
  • .NET代码审计之bin目录任意访问
    0x01案例一bin目录在.NET下默认不允许通过HTTP请求访问,如果想设置能访问的话,通过移除<requestFiltering>标签内的<hiddenSegments>即可,黑盒扫描的时候记得要扫一下bin目......