齐博CMSv7

太菜了。。目前暂时只找到了一些后台的洞。。既然后台不是getshell,个人感觉都较鸡肋,希望师傅们轻喷。

初步了解

数据库类

$db为数据库操作类
类的一些方法在
inc/mysql_class.phpMYSQL_DB
中定义

函数

核心系统要调用的一些函数与类的文件存放在inc目录下

过滤函数

function filtrate($msg){
    //$msg = str_replace('&','&',$msg);
    //$msg = str_replace(' ',' ',$msg);
    $msg = str_replace('"','"',$msg);
    $msg = str_replace("'",''',$msg);
    $msg = str_replace("<","<",$msg);
    $msg = str_replace(">",">",$msg);
    $msg = str_replace("\t","       ",$msg);
    //$msg = str_replace("\r","",$msg);
    $msg = str_replace("   ","   ",$msg);
    return $msg;
}

后台任意文件删除

从函数入手
在inc目录下全局搜索unlink

将目标锁定在

文件:inc/function.inc.php
函数:del_file
function del_file($path){
    if (file_exists($path)){
        if(is_file($path)){
            if( !@unlink($path) ){
                $show.="$path,";
            }
        } else{
        ....

简单的对$path参数进行了判断,未经过任何过滤,就进行了@unlink($path)
于是现在寻找调用该函数的位置
在前台和会员中心并未发现调用该函数的地方

在后台有多处调用该函数

将目光定位在

文件:admin/mysql.php

关键代码

/**
*删除选定的备份数据
**/
elseif($action=='del'&&$Apower[mysql_del]){
    if(!$baktime){
        showmsg('请选择一个');
    }
    del_file(ROOT_PATH."cache/mysql_bak/$baktime");
    if(!is_dir(ROOT_PATH."cache/mysql_bak/$baktime")){
        jump("数据删除成功","index.php?lfj=mysql&job=del",5);
    }else{
        jump("数据删除失败,请确认目录属性为0777","index.php?lfj=mysql&job=del",5);
    }
}

首先需要选择备份文件,然后直接调用del_file函数对该备份文件进行删除
仅仅是拼接在了ROOT_PATH."cache/mysql_bak后。跳出该目录即可进行任意文件删除

漏洞验证

备份文件在
\cache\mysql_bak
先备份文件,接着删除该备份文件


修改baktime../hack即可删除该目录

后台鸡肋SQL注入

既然是后台注入。那么暂且归为鸡肋

漏洞分析

本来在找任意文件写入,结果歪打正着找到了一个注入

文件:admin/html.php

第296行处

...
    if($fiddb){
        $stringFID=implode(",",$fiddb);
        $SQL=" fid IN ($stringFID) ";
    }elseif($idDB){
        $string=implode(",",$idDB);
        $SQL=" id IN ($string) ";
    }
    $str="<?php\r\n\$weburl='$WEBURL&step=end';\r\n";
    $query = $db->query("SELECT id,fid FROM {$pre}special WHERE $SQL LIMIT 3000");
    ...

$idDB变量和$fiddb都是从get传入,两个参数都能造成注入,这里用$idDB变量。
传入$idDB变量后,由于用到了implode函数这里idDB需要是数组,之后将该变量直接拼到了id IN ($string) 中给了$SQL变量,然后又直接将$SQL变量拼接进了数据库查询语句,这中间没有任何过滤,于是可造成SQL注入攻击
query = $db->query("SELECT id,fid FROM {$pre}special WHERE $SQL LIMIT 3000");

漏洞验证

后台大多数功能通过lfj参数进行访问,参数为文件名
需要传入参数action=make_SPhtml才能进入判断

于是我们访问的链接
127.0.0.1:12345/7bocms/admin/index.php?lfj=html&action=make_SPhtml&idDB=1
直接就报错了,因为这里需要$idDB是数组

所以我们重新传参(由于跳转,放到BP里验证)
在构造payload过程中发现

会把) 后面的给 "吃掉"
于是尝试用加号绕过

再将#编码%23
成功注入

poc=/admin/index.php?lfj=html&action=make_SPhtml&idDB[]=1)+and+(updatexml(1,concat(0x7e,(select+user()),0x7e),1))%23

源链接

Hacking more

...