pcfcms安装页面的一处意料之外的变量注入可导致网站瘫痪

阅读量    179075 | 评论 3

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

前言:

在代码审计环节当中,本人偏向于先审计网站安装文件,因为在这里涉及了很多对数据库的操作,如果在网站安装完后没有删除安装文件,或者对网站安装页面访问的限制不够严谨,就会导致产生恶意访问的情况,轻则数据被篡改,重则被重装,注入

近期在php代码审计过程当中发现了pcfcms在install文件中有一处判断过滤不严谨的地方,可导致恶意入侵者篡改本不应该运行的安装过程中的数据,最后造成网站瘫痪


实验环境:
wampserver3.1.7 64bit
phpversion:7.2.14
MySQL:5.7.24
Apache:2.4.37
url::http://127.0.0.4/pcfcms/
pcfcms:V2.1.1
pcfcms纯净版下载地址:
http://www.pcfcms.com/
这里需要注意,php版本需要高于7.1且php的上传限制要大于8M,否则安装页面会报错

 

pcfcms介绍:

PCFCMS是基于TP6.0框架为核心开发的免费+开源的企业内容管理系统,专注企业建站用户需求提供海量各行业模板,降低中小企业网站建设、网络营销成本,致力于打造用户舒适的建站体验。

 

代码分析:

首先进入程序安装页面http://127.0.0.4/pcfcms/install/index.php

然后按照步骤配置好后安装成功

当出现这个提示说明安装成功

安装成功后再次访问该文件会提示

总结这个安装过程中需要手动输入的有数据库信息,管理员账号密码,看一下/install目录下的情况

(请忽略exp.txt文件)可以看出增加了install.lock文件,但是安装页面并没有被删除,进入index.php文件内开始审计

这里注意代码的37行-43行
if($get!='step5-1'){....程序已安装...
};

在之前对$get变量有个定义
$get=@$_GET['type']?$_GET['type']:$config['indexpage'];
也就是说,$get就是我们用户以get方式向服务器提交的参数,如果我们get的不是type=step5-1,那么程序会对install.lock文件做个判定,这里的step1到step5就是程序进行配置$config和$db_config的步骤
尝试get方式提交type=step5-1

(这里要注意当安装完成后要清除cookie,否则访问无效)
可以看到,当type=step5-1时,成功绕过了install.lock的文件检测,追踪两项关于账户密码的报错:

/step5-1.html文件第十五行,调用了php代码分别输出$_SESSION[‘adminaccount’]和$_SESSION[‘admin_password’];回头来看index.php中哪里定义了这两个数据:

可以看到,在148与149行,当满足if语句$_POST[‘type’]==’3’时,程序会接收来自post方式上传的账号密码,再来追踪$_POST[‘admin_account’]和$_POST[‘admin_password’]

在157和160行内,程序会直接接收用户post的账户密码,并在161行生成插入数据库的语句,并在接下来的语句中进行插入,但是,我们只上传了账户密码,数据库配置需要满足
if ($get == $config[‘importPage’]),

所以此时的数据库内容为空,但是进行强行插入的话就会导致数据库内容无法连接,如果访问者post了admin_account=”任意值”,并且符合条件type=step5-1,程序则会向错误的数据库插入数据,最后导致网站无法连接致正确的数据库,攻击产生

 

漏洞利用过程:

访问页面
http://127.0.0.4/pcfcms/public/install/index.php?type=step5-1
post数据:type=3&admin_account=123&admin_password=123

刷新页面:

访问主页:

修补建议:

安装完成后不建议保留安装文件

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多