某cms复现学习

前言
感觉自己还是对php审计有点不懂,遂找了个cms复现了一下几个类型的洞,本人小白一个,大佬请绕道嘻嘻。

正文
小插曲:首先源码拉下来本地搭建的时候死活不行,后来看了index发现,原来判断了install下是否存在install.lock防止重装,而源码拉下来的时候就已经存在install.lock了。
有些是参考的,有的没有查到相关的只能自己硬着头皮找了。

第一处:sqli
进后台随便点点,看下这请求,
GET /tuzicms-master/index.php/Manage/Download/index/id/11 HTTP/1.1
这路由各位师傅们应该都懂了。
在App/Manage/Controller/AdvertController.class.php中

某cms复现学习


id直接进行了拼接,验证:

数据库用户信息:

后面发现很多controller中都是用id=$id写的,便全局搜索:

发现有20多个,去相关漏洞信息库上搜索了一下,发现也确实有这么多的提交。

第二处getshell
在cnvd上发现:

某cms复现学习


然后全局搜索:

_fe

某cms复现学习


发现是一个设置分页配置信息的:

public function do_fenye() {
        //**判断是否有限权,显示登录管理员信息
        $id=$_SESSION['id'];
        //dump($id);
        //exit;
        $m=D('Admin');
        $arr=$m->find($id);
        $arr=$arr['admin_type'];
        //dump($arr);
        //exit;
        if ($arr==1){// 如果不是超级管理员限权
            $this->error('你不是超级管理员,没有限权!');
        }
        //exit;

        //定义配置文件的路径
        $setfile=CONF_PATH."config_fenye.php";
        //      dump($setfile);
        //      exit;

        //文章模型分页参数
        $arr=C('PAGE_ARTICLE__HOME');
        $cache_index=array(
                'PAGE_ARTICLE__HOME' => $arr,
        );

        $cache_index_post=array(
                'PAGE_ARTICLE__HOME' => I('post.PAGE_ARTICLE__HOME'),
        );
        //合并数组
        $cache_index_ok=array_merge($cache_index,$cache_index_post);

        //产品模型分页参数
        $arr=C('PAGE_PRODUCT__HOME');
        $cache_group=array(
                'PAGE_PRODUCT__HOME' => $arr,
        );

        $cache_group_post=array(
                'PAGE_PRODUCT__HOME' => I('post.PAGE_PRODUCT__HOME'),
        );
        //合并数组
        $cache_group_ok=array_merge($cache_group,$cache_group_post);

        //图片模型分页参数
        $arr=C('PAGE_PHOTO__HOME');
        $cache_detail=array(
                'PAGE_PHOTO__HOME' => $arr,
        );

        $cache_detail_post=array(
                'PAGE_PHOTO__HOME' => I('post.PAGE_PHOTO__HOME'),
        );
        //合并数组
        $cache_detail_ok=array_merge($cache_detail,$cache_detail_post);



        //下载模型分页参数
        $arr=C('PAGE_DOWNLOAD__HOME');
        $download_detail=array(
                'PAGE_DOWNLOAD__HOME' => $arr,
        );

        $download_detail_post=array(
                'PAGE_DOWNLOAD__HOME' => I('post.PAGE_DOWNLOAD__HOME'),
        );
        //合并数组
        $download_detail_ok=array_merge($download_detail,$download_detail_post);

        //将配置文件的结构列出来,然后把要修改的参数用变量代替,执行覆盖操作即可。
        $settingstr="<?php \n return array(\n";
        foreach($c as $key=>$v){
            $settingstr.= "\t'".$key."'=>".$v.",\n";
        }

        foreach($cache_index_ok as $key=>$v){
            $settingstr.= "\n\t'".$key."'=>'".$v."',\n";
        }
        foreach($cache_group_ok as $key=>$v){
            $settingstr.= "\n\t'".$key."'=>'".$v."',\n";
        }
        foreach($cache_detail_ok as $key=>$v){
            $settingstr.= "\n\t'".$key."'=>'".$v."',\n";
        }

        foreach($download_detail_ok as $key=>$v){
            $settingstr.= "\n\t'".$key."'=>'".$v."',\n";
        }

        $settingstr.="\n);\n?>\n";

        //              dump($settingstr);
        //              exit;

        if (file_put_contents($setfile,$settingstr)){//通过file_put_contents保存setting.config.php文件
            $this->success('修改成功');
        }else {
            $this->error('修改失败,请修改要更改文件的权限!');
        }

    }

可以看到后面存在了很多拼接,通过$setfile=CONF_PATH."config_fenye.php";发现配置文件为

某cms复现学习


看第一个配置:

实际上就是post一个 PAGE_ARTICLE__HOME,
通过C()获取的$arr被array_merge覆盖了
再看I():

获取传递的变量,其中有个$filter,没有指定一般是默认,

搜索一下:

这两个htmlspecialchars,strip_tags对'的效果:

因此可以闭合来写shell:
 

第三处任意文件删除
后台delSqlFiles():

某cms复现学习


直接拼接,没什么好说的

第四处前台反射xss
payload:
GET index.php/article/group/id/2/" οnmοuseοver=alert(/xss/) /

某cms复现学习


一般这种大概流程就是输入-数据库-返回-调用模板-解析-返回前台(理解比较浅显),然后调试跟踪到返回url赋值的地方:

前面是__APP__拼接,值已经是:

再往回走发现,__APP__在这里定义:

那往回看PHP_FILE

if(!defined('__APP__')){
            $urlMode        =   C('URL_MODEL');
            if($urlMode == URL_COMPAT ){// 兼容模式判断
                define('PHP_FILE',_PHP_FILE_.'?'.$varPath.'=');
            }elseif($urlMode == URL_REWRITE ) {
                $url    =   dirname(_PHP_FILE_);
                if($url == '/' || $url == '\\')
                    $url    =   '';
                define('PHP_FILE',$url);
            }else {
                define('PHP_FILE',_PHP_FILE_);
            }

又是通过_PHP_FILE_定义
再往回走,

某cms复现学习


发现直接通过$_SERVER['SCRIPT_NAME']来定义
而一开始

SCRIPT_NAME的就已经包含payload了,百度搜索了一波,发现
$_SERVER[SCRIPT_NAME]变量可值注入恶意代码
这个xss大概分析了一下,感谢,又学到了。

上一篇:使用 Ettercap嗅探工具进行 DNS 欺骗实验


下一篇:ubuntu18.04安装CARLA+CARLA-ROS-BRIDGE