wolf cms上传漏洞分析

最近看Freebuf上的wolf CMS任意上传漏洞分析,今天有空就复现下,在此做个记录总结

环境准备

打开MySQL,创建一个数据库,库名叫wolf:

将下载好的wolf cms放在wamp的www目录下:

打开浏览器访问127.0.0.1,配置如下,点击continue to install:

Wamp中MySQL的默认账号:root,密码为空。直接点击install now:

记住下面的登录账号密码,待会要用到。这个密码是随机产生的:

成功登录后台:

漏洞分析

这些准备操作就绪后,我们来分析一下存在安全问题的php函数。该函数位于C:\wamp\www\wolf\plugins\file_manager\FileManagerController.php。我们找到问题函数upload():

1
2
3
4
5
6
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$ext_arr = array('php', 'php3', 'php4', 'inc');
if (in_array($ext, $ext_arr)) {
Flash::set('error', __('Not allowed to upload files with extension :ext', $ext));
redirect(get_url('plugin/file_manager/browse/'));
}

用$ext存储上传文件的后缀名,如果后缀名在$ext_arr数组组中,则输出错误警告,并将url重定向到plugin/file_manager/browse/。这就是典型地采用了黑名单机制,这也是问题所在。只要我们绕过了检查,即后缀名不在该数组中即可。更具体的代码分析点这里

漏洞利用过程

我们上传一个cmd.php.ppp

这个ppp可以是任意的后缀,只要服务器无法识别就行。由于服务器无法识别ppp这个后缀名,他就会从左往右按顺序识别,即找到php,发现可以识别,于是就将cmd.php.ppp按照php文件来解析,这就导致我们的webshell可以在服务器端成功执行。使用菜刀连接http://localhost/public/cmd.php.ppp
下面是我们成功拿到服务器的截图:

除了可以绕过黑名单,我们还可以直接利用编辑文件的功能,将我们的webshell直接写入服务器,过程如下:


写入一句话,并保存:


使用菜刀连接:

使用“.phtml”(或者“php.”)为后缀命名文件,也可以绕过。

漏洞总结

在编写服务器端代码时,切不可相信来自用户的任何输入、文件,都要对其进行严格检查。采用黑名单机制只可暂时防止部分恶意输入,总是有能被绕过,应该采取白名单代替。该版本cms允许用户通过后台直接创建、编辑文件,但是未对用户输入的内容进行安全验证,这也导致了攻击者可以上传webshell。

文章作者: Mochazz
文章链接: https://mochazz.github.io/2017/07/06/wolf_cms/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog