某fishcms 后台存在任意文件删除+getshell
这是一个睿智 漏洞分析 9690浏览 · 2019-05-18 01:46

前言

这两天挑了款 cms 审计了一下。还是 tcl ,没审计出什么很厉害的洞。分享一下挖的思路

漏洞分析

找了一圈关键字,找到一处:

后台的删除幻灯片处:

我们看到有一句:

@unlink(APP_PATH . '..'. DS . $yfile);

$yfile 是哪里来的呢?

$yfile = str_replace($yuming['option_value'],'',$slide['slide_pic']);

$slide 是从数据库里查出来的。

临时跳一下,跳到 添加幻灯片 处。看看我们的 slide_pic 是怎么加进去的。

可以看到是获取了 slideshow 这个参数。这里并没有任何检查

我们再跳回 removeSlide 这个函数。

我们会发现在 unlink 前有个 if

if(!empty($yfile) && $this->isLegalPicture($slide['slide_pic'])){

没错,isLegalPicture 这个函数就是检查函数,这个函数大概做了两件事:

  1. 判断文件名后缀是否为图片(白名单
  2. 判断文件名是否带有 /data/

这里第二个条件,是要 dirname 含有 /data/,不能是 /data/a.jpg ,但可以是 /data/a/a.jpg

现在知道变量来源了,我们再精简一下代码,把关键代码剪出来:

$yfile = str_replace($yuming['option_value'],'',$slide['slide_pic']);
if($this->isLegalPicture($slide['slide_pic'])){
@unlink(APP_PATH . '..'. DS . $yfile);
}

没错,这里最大的问题就是 isLegalPicture 的传参 和 unlink 的传参不一致。

我们会发现上面有个 str_replace,他会把 $yuming['option_value'] 替换成

那么我能不能让 $yuming['option_value'] 变成一些特殊的值呢?

那么这个东西是什么呢?这玩意儿其实就是。

这里修改虽然前端有限制,但是挡不住我们万能的 bp(后端没有限制)。

现在我们就可以想想怎么利用了:

  1. 修改幻灯片为 /data/b/111.jpgapplication/install.lock/data/b/111.jpg
  2. 修改 站点域名/data/b/111.jpg
  3. 删除指定幻灯片

删除时把 /data/b/111.jpg 替换为空,就是 application/install.lock 了。

漏洞复现

首先 登陆后台,输入账号密码后可能会显示这个:

但是这里过滤不严,我们可以直接访问:/admin/Index/web.html

(首先我们要先抓到 修改幻灯片 和 删除幻灯片的包,因为我们修改了站点域名之后 jscss 会直接加载不出来。。。)

系统设置 => 网站信息 的包,然后 domain 参数改成:/data/b/111.jpg

此时的 options 表:

然后 修改幻灯片 的数据包中,把 slideshow 改为:/data/b/111.jpgapplication/install.lock/data/b/111.jpg

用刚刚抓到的删除包 repeater 一次就好了:

这时候我们再看的 application 目录就已经删掉了。但是如果我们想写 shell 我们还得把 application/.htaccess 删掉。

我们把 id=2 的 幻灯片改成图片:/data/b/111.jpgapplication/.htaccess/data/b/111.jpg

这里就不截图了。

删除之后:

然后我们就可以重新安装了:

这里我们不知道服务器的 mysql 账号密码的话,可能需要将 数据库服务器 的地址修改成网络上的,也可以是自己的 vps
然后把 数据库名 修改成:',eval($_GET[1]),'
其他的正常填,下一步。。

看看 application/database.php 文件:

总结

审了很久,也许是经验不太够(太菜),只审出了一个 laji 洞。

总结一下这个洞,大概就是传递的参数不同导致的,实际开发中还是不能太粗心,保证参数的统一。

0 条评论
某人
表情
可输入 255

没有评论

目录