最近看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 | $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); |
用$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。