[代码审计] fengcms1.32从详细漏洞分析到漏洞利用
## 前言
这是我在此发表的第一篇代码审计的文章,仅供学习参考!首发于哈拉少安全小队微信公众号
一、Cms初识:
FengCms——由地方网络工作室基于PHP+MYSQL开发。是一款开源的网站内容管理系统。系统支持自由订制模型,你完全可以用FengCms打造一个你想要的任意展示模型。模版和程序分离、自由标签系统,让FengCms灵活无比。拥有FengCms,你可以完成国内95%的网站制作需要!
-目录结构:
二、漏洞描述:
在fengcms的安装程序中,由于安装检测判断代码无效和写入文件时代码过滤不严,添加数据到配置文件的时候,可以插入任意恶意payload,达到实现闭合原本的代码,使插入的webshell存留在了配置文件中,从而getshell。
三、漏洞分析过程:
--首先分析一下/install/index.php:
在install目录下的index.php文件中的第25行代码,可以看到这里进行了是否安装过的检测,判断了install目录是否存在,然后输出前端js代码对用户进行提示:
但是注意:判断完之后,程序是没有立刻停止执行的,导致后续的安装步骤代码仍然都会继续往下执行,这也是导致漏洞产生危害的原因之一:
安装过程就是通过判断GET方式传入的step参数,控制安装流程:
剩下的步骤代码类似,具体就是以下文件:
--接下来分析一下/install/install.php文件:
这里获取到表单中POST传过来的数据,进行数据库连接:
表单内容:
可以看到这里以写入的方式打开了$files,然后将$config作为内容直接写入进去,但是可以看到这里是没有进行任何过滤的,同时这个$config的内容是我们可控的(看后面的代码截图):
$file在/install/install.php的第8行定义了,是配置文件的路径:
$config是在/install/data.php中定义,用file_get_contents读取了配置文件的内容:
$config_file是在/install/index.php中定义了,读取原配置文件,然后对原文件进行了内容替换,并且替换的内容就是通过GET方式传过来的,并且是我们可控的(在step3.php中获取我们了输入的内容,然后直接进行了替换),没有进行任何的过滤:
step3.php:
看一下/config.php中的配置内容:
所以我们只需要在表前缀处插入恶意payload即可,最终效果如下:圈住的地方就是我们传入的恶意payload,')闭合了前面的代码,//注释后面的代码,成功将payload留在了config.php中:
执行流程:
入口文件/index.php,这里包含了/system/app.php文件:
跟进/system/app.php文件:在这里会包含引入配置文件,所以当我们访问index.php入口文件的时候,会执行config.php文件中插入的恶意payload,从而getshell:
四、漏洞利用:
1、访问安装页面
按照步骤执行:
step3时,在表前缀处插入恶意payload:
f_');eval($_POST['xx']);//
安装完成:
再次查看config.php,已经成功被插入webshell:
直接访问入口文件index.php,可以成功执行:
蚁剑连接:
虚拟终端执行命令:
根据前面代码分析到,虽然已经安装过了,但是再次访问安装程序,还是能正常执行的:
五、漏洞修复:
1、在判断已经安装过之后,立即让程序停止执行,添加exit()代码即可:
2、添加在写入文件前添加过滤机制
有需要源码的关注公众号:哈拉少安全小队,后台留言:fengcms1.32,即可获取!