如何锤一个外挂网站

前言

无意间看到的一个外挂网站,发现使用的是一套开源的CMS。

把CMS下载过来看了下,发现跟上篇分析的 MyuCMS 简直一模一样….某些函数和业务逻辑完全相同,某些漏洞原因也相同。

过程分析

漏洞挖掘

因为是开源CMS,那么肯定会有已知漏洞。

我尝试这去 CNVD 上搜了下,发现这套 CMS 同样存在SQL注入,文件上传,命令执行等,但多数漏洞都在后台,这样的话如果进不了后台也没办法。

这套 CMS 跟 MyuCMS 一样,同样有一个任意文件下载。但这里的修复方式如下

1
2
3
4
5
6
7
8
9
10
11
public function download($url, $name, $local)
{
$local1 = $local;
if (strpos($url, 'zip') === false || strpos($url, 'rar') === false) { // 这里是修复代码
$local1 = 0;
}
$down = new Http();
if ($local1 == 1) {
$down->download($url, $name);
}
}

其实上述的修复方式在 Windows下依然可以用指定一个不存在的目录,然后用目录穿越符跳回上一层的方式绕过。

1
./ziprar/../../../../

但这里目标为 Linux 环境,所以这里就无法利用了。

这时思路想到了,因为这个 CMS 基于 thinkphp5.0.24 开发,这里有个可以利用的点就是在 thinkphp5.0.24 有一条反序列化链可以直接任意文件写入,但这条POP链只能在 Linux 下使用,这点正好与目标环境相符。

但搜寻了一波,前台没有可控的反序列化点,同时 phar 反序列化条件也不满足。

又审计了一波前台功能,也没发现可以 getshell 的漏洞。这时只能将目标转向进入目标后台。

因为之前查 CNVD 的时候,这个 CMS 是有注入的。那这样便可以通过注入拿到密码hash,来尝试进行破解。

又找了一圈,在 user 模块,index控制器的home方法中,找到了如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$id = input('id');
if (empty($id)) {
return $this->error('亲!你迷路了', 'index/index/index');
} else {
$member = new UserModel();
$m = $member->where("id = {$id}")->find($id); // 这里跟 MyuCMS 中的注入问题相同,where方法使用字符传递。
if ($m) {
$this->assign('m', $m);

$type = input('type');
$uid = session('userid');
$self = 0;
if ($id == $uid) {
$self = 1;
}

找到了 SQL 注入,接下来就是来获取后台账号和密码Hash了。在使用 updatexml 函数提示

updatexml用不了,那换个 payload,最后使用 floor() 函数来进行报注入,成功拿来了密码 Hash 和 Salt

通过翻看源码发现,加密方式为 MD5($password.$salt)

抱着试一试的心理将这串 Hash 和 Salt 放到 CMD5 上尝试解密,没想到真的查到了…

二话不说,直接干进后台。(居然用的不是免费版,还买了授权)

GetShell

进来后台,getshell就容易了,因为站点的配置信息写在了php文件里,所以修改站点配置信息即可getshell,原理跟上篇分析的 MyuCMS 代码执行类似。直接抓包,修改数据。