作者:ddwGeGe

本文转自先知社区:https://xz.aliyun.com/t/11774

前言

无意中浏览到某小众OA官网且可以下载到源码,随机审计一波,最后成功Getshell,大佬勿喷

目录结构

环境搭建

WIN11 + PhpStudy(Mysql) + Redis + IDEA(Tomcat 8.0)

将sql文件导入到phpstudy(Mysql)中,同时启动Redis服务,配置好数据库环境

采用白+黑进行审计,从功能点出发,在个人资料处图像可以进行上传

开始抓包进行文件上传,后缀和文件内容均没有做校验,且返回上传的路径和文件名,本以为可以直接getshell,但却无法解析,且该文件并没有落地

代码审计

根据数据包的路径(/func/upload/uploadImages)直接搜索路由,成功找到上传函数

首先会对db的值进行判断,根据db的值来决定上传文件的保存方式

初始上传的时候,db=1,而if的GlobalConstant.FILE_UPLOADER_SAVE_FILE=0,故直接进入到else if

新的文件名 = 上传时间 + 10位随机数 + 原始上传文件的后缀名

String extend = FileUtils.getExtend(fileName);// 获取文件扩展名
String noextfilename = DateUtils.getDataString(DateUtils.SDF_YYYYMMDDHHMMSS) + StringUtil.random(10);//自定义文件名称
String myfilename= noextfilename+"."+extend;//自定义文件名称

文件存储在数据库中,并将文件名通过map保存,最后返回在数据包中

db可控,在上传的时候,将db=1改为db=0,进入到if

会创建新的上传目录,新的目录 = Web根目录 + upload + 上传时间(年月日),若不存在则进行新建

String realPath = request.getSession().getServletContext().getRealPath("/") + "/upload/" + strYYYYMMDD + "/";// 文件的硬盘真实路径
String path = "upload/" + strYYYYMMDD + "/";
File file = new File(realPath);
    if (!file.exists()) {    
    file.mkdirs();// 创建根目录
}

新的文件名的命名方式跟else if基本一致,在获取文件的后缀名的时候,并未进行检查和过滤,直接进行拼接,从而造成了文件上传漏洞

最后将上传文件内容直接复制到新创建的文件

FileCopyUtils.copy(mf.getBytes(), savefile);

最后通过map进行存储,且将文件上传路径和文件名分别存储在 filePath、saveName

Map<String, Object> map = new HashMap<String, Object>();
map.put("filePath", GlobalConstant.CONFIG_FILE_SAVE_DB_URL + myfilename);
map.put("saveName", noextfilename);

上传回显的Jsp Webshell,将db在上传的时候改为db=0,成功上传,可执行命令

记一次某CMS代码审计(转载)的更多相关文章

  1. 记一次 FastAdmin CMS 内容提示空的问题

    记一次 FastAdmin CMS 内容提示空的问题 有小伙伴反馈 FastAdmin CMS 安装后出现内容有文字,但提示错误 的问题. 我在本地重新安装测试并没有发现这个问题,一切正常,编辑器也可 ...

  2. 记一次海洋cms任意代码执行漏洞拿shell(url一句话)

    实验环境:海洋CMS6.54(后续版本已该洞已补) 1.后台登录尝试 这个站点是个测试站,站里没什么数据. 进入admin.php,是带验证码的后台登录系统,没有验证码的可以用bp爆破.有验证码的也有 ...

  3. 某cms代码审计

    前言   前几个礼拜上课老师带着挖cms的洞,挖出个cookie反序列化注入漏洞,和报错注入并且提交了cnvd.昨天去找源码的时候发现它更新了一个版本,更新日志上也没说修复,就想着看看漏洞还存不存在, ...

  4. linux内核奇遇记之md源代码解读之四

    linux内核奇遇记之md源代码解读之四 转载请注明出处:http://blog.csdn.net/liumangxiong 运行阵列意味着阵列经历从无到有,建立了作为一个raid应有的属性(如同步重 ...

  5. MySQL用source命令导入不记入binlog中【原创】

    试验环境,MySQL主主复制 主库10.72.16.112 从库10.72.16.50 一直有个疑问,利用sql_log_bin=0可以临时在客户端停止将操作记入binlog中,如果使用source命 ...

  6. 关于 CMS 垃圾回收器,你真的懂了吗?

    大家好,我是树哥. 前段时间有个小伙伴去面试,被问到了 CMS 垃圾回收器的详细内容,没答出来.实际上,CMS 垃圾回收器是回收器历史上很重要的一个节点,其开启了 GC 回收器关注 GC 停顿时间的历 ...

  7. jQuery插件之验证控件jquery.validate.js

    今天学习一下jQuery.Validate插件,为便于日后翻阅查看和广大博客园园友共享,特记于此. 本博客转载自:jQuery Validate jQuery Validate 插件为表单提供了强大的 ...

  8. 对Emlog 6.0 Beta的完整代码审计过程

    Emlog 6.0 beta版本,这可能是最后一篇关于PHP语言CMS的代码审计文章,此次将详细记录完整的审计过程. 文章基本上完整记录小东的对此CMS审计过程,或许显得繁琐,但代码审计的过程就是这样 ...

  9. 反序列化之PHP原生类的利用

    目录 基础知识 __call SoapClient __toString Error Exception 实例化任意类 正文 文章围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到 ...

  10. 转载:Chrome调试折腾记_(1)调试控制中心快捷键详解!!!

    转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致…按下F12;还是熟悉的味道;  或者直接 Ctrl ...

随机推荐

  1. C# 返回指定目录下所有文件信息

    返回指定目录下所有文件信息 /// <summary> /// 返回指定目录下所有文件信息 /// </summary> /// <param name="st ...

  2. linux java 环境搭建

    java -version 是否安装 yum -y remove java-1.7.0-openjdk* yum -y install java-1.7.0-openjdk* vim /etc/pro ...

  3. CSS pointer-events 属性

    pointer-events 属性用于设置元素是否对鼠标事件做出反应. CSS 语法 pointer-events: auto|none; 属性值 属性值 描述 auto 默认值,设置该属性链接可以正 ...

  4. 【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现

    [桥接设计模式详解]Java/JS/Go/Python/TS不同语言实现 简介 桥接模式(Bridge Pattern)是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的 ...

  5. GO语言学习笔记-反射篇 Study for Go ! Chapter nine - Reflect

    持续更新 Go 语言学习进度中 ...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs ...

  6. Python学习笔记--文件的相关操作

    文件的读取操作 读操作 实现: read()--读完 read(10)--读取10个字节 readline()--将所有行并到一行输出 readlines()--一次读取一行 文件的关闭: 实现: 上 ...

  7. SQL统计(一)

    参考博客: https://blog.csdn.net/GuTiDong/article/details/81326787 按月份统计每个月的订单总金额 https://blog.csdn.net/h ...

  8. Linux0.11源码学习(三)

    Linux0.11源码学习(三) linux0.11源码学习笔记 参考资料: https://github.com/sunym1993/flash-linux0.11-talk https://git ...

  9. 从零开始,开启属于你的 RTE 漫游之旅!丨漫游指南 x 即将启航

    什么是「开发者漫游指南」? 「开发者漫游指南」邀请热爱前端开发.关心音视频领域发展.希望进入音视频行业.乐于和大家一起交流成长的小伙伴,通过「开发者漫游指南」与社区共同成长,帮助更多的开发者在实时音视 ...

  10. java多线程--6 死锁问题 锁Lock

    java多线程--6 死锁问题 锁Lock 死锁问题 多个线程互相抱着对方需要的资源,然后形成僵持 死锁状态 package com.ssl.demo05; public class DeadLock ...