Hu3sky's blog

齐博CMSv7审计

Word count: 869 / Reading time: 4 min
2019/01/28 Share

齐博CMSv7

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

初步了解

数据库类

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

函数

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

过滤函数

1
2
3
4
5
6
7
8
9
10
11
12
function filtrate($msg){
//$msg = str_replace('&','&',$msg);
//$msg = str_replace(' ',' ',$msg);
$msg = str_replace('"','"',$msg);
$msg = str_replace("'",''',$msg);
$msg = str_replace("<","&lt;",$msg);
$msg = str_replace(">","&gt;",$msg);
$msg = str_replace("\t"," &nbsp; &nbsp;",$msg);
//$msg = str_replace("\r","",$msg);
$msg = str_replace(" "," &nbsp; ",$msg);
return $msg;
}

后台任意文件删除

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

将目标锁定在

1
2
文件:inc/function.inc.php
函数:del_file
1
2
3
4
5
6
7
8
function del_file($path){
if (file_exists($path)){
if(is_file($path)){
if( !@unlink($path) ){
$show.="$path,";
}
} else{
....

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

在后台有多处调用该函数

将目光定位在

1
文件:admin/mysql.php

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
*删除选定的备份数据
**/
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注入

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

漏洞分析

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

1
文件:admin/html.php

第296行处

1
2
3
4
5
6
7
8
9
10
11
   ...
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
成功注入

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

CATALOG
  1. 1. 齐博CMSv7
  2. 2. 初步了解
    1. 2.1. 数据库类
    2. 2.2. 函数
      1. 2.2.1. 过滤函数
  3. 3. 后台任意文件删除
    1. 3.1. 漏洞验证
  4. 4. 后台鸡肋SQL注入
    1. 4.1. 漏洞分析
    2. 4.2. 漏洞验证