前言:
在代码审计环节当中,本人偏向于先审计网站安装文件,因为在这里涉及了很多对数据库的操作,如果在网站安装完后没有删除安装文件,或者对网站安装页面访问的限制不够严谨,就会导致产生恶意访问的情况,轻则数据被篡改,重则被重装,注入
近期在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
刷新页面:
访问主页:
修补建议:
安装完成后不建议保留安装文件
发表评论
您还未登录,请先登录。
登录