Ofcms-(java代码审计学习)

news2024/11/25 0:30:49

1、背景

根据《java代码审计实战》学习进行记录,java代码审计CMS实战。

2、Ofcms下载

可搜索Ofcms1.1.2版本进行下载。下载连接:ofcms: java 版CMS系统、基于java技术研发的内容管理系统、功能:栏目模板自定义、内容模型自定义、多个站点管理、在线模板页面编辑等功能、代码完全开源、MIT授权协议。QQ 群: (2)185948056 (gitee.com)icon-default.png?t=O83Ahttps://gitee.com/oufu/ofcms

3、漏洞审计

3.1、SQL注入

代码位置:src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateController.java”文件可能存在 SQL 注入漏洞。

	public void create() {
		try {
			String sql = getPara("sql");
			Db.update(sql);
			rendSuccessJson();
		} catch (Exception e) {
			e.printStackTrace();
			rendFailedJson(ErrorCode.get("9999"), e.getMessage());
		}
	}
}

通过getPara("sql")获取参数sql,在方法Db.update中执行。同样往该程序确定路由:/system/ge erate

@Action(path = "/system/generate", viewPath = "system/generate/")

我们代码的位置处于admin目录下的子文件说明该漏洞处罚条件需要登录后验证我们验证一下:通过路由设置sql=UPDATE%20of_cms_api%20SET%20api_url= updatexml(2,concat(0x7e,(version())),0)

调试处理:该处代码没有进行过滤,预编译等技术处理直接执行sql。

3.2、目录遍历漏洞

代码位置:“src/main/java/com/ofsoft/cms/admin/controller/cms/TemplateController.java”文件存在目录 遍历漏洞。

    public void getTemplates() {
        //当前目录
        String dirName = getPara("dir","");
        //上级目录
        String upDirName = getPara("up_dir","/");
        //类型区分
            String resPath = getPara("res_path");
        //文件目录
        String dir = null;
        if(!"/".equals(upDirName)){
              dir = upDirName+dirName;
        }else{
              dir = dirName;
        }
        File pathFile = null;
        if("res".equals(resPath)){
            pathFile = new File(SystemUtile.getSiteTemplateResourcePath(),dir);
        }else {
            pathFile = new File(SystemUtile.getSiteTemplatePath(),dir);
        }

        File[] dirs = pathFile.listFiles(new FileFilter() {
            @Override
            public boolean accept(File file) {
                return file.isDirectory();
            }
        });
        if(StringUtils.isBlank (dirName)){
            upDirName = upDirName.substring(upDirName.indexOf("/"),upDirName.lastIndexOf("/"));
        }
        setAttr("up_dir_name",upDirName);
        setAttr("up_dir","".equals(dir)?"/":dir);
        setAttr("dir_name",dirName.equals("")?SystemUtile.getSiteTemplatePathName():dirName);
        setAttr("dirs", dirs);
        /*if (dirName != null) {
            pathFile = new File(pathFile, dirName);
        }*/
        File[] files = pathFile.listFiles(new FileFilter() {
            @Override
            public boolean accept(File file) {
                return !file.isDirectory() && (file.getName().endsWith(".html") || file.getName().endsWith(".xml")
                        || file.getName().endsWith(".css") || file.getName().endsWith(".js"));
            }
        });

通过pathFile = new File(SystemUtile.getSiteTemplateResourcePath(),dir);传入dir;dir参数直接从String dirName = getPara("dir","");传入;而这个过程及后面对dir和pathfile并没有做其他的过滤操作直接return,那么我们可以登录后台在路由:@Action(path = "/cms/template")下做操作;(路由确认可通过burpsuite访问模板文件得到;结合代码中满足其他几个参数res_path=res&up_dir=&dir=)来确认。

目录遍历需要在访问的url上禁用../目录回溯符来预防该类型漏洞。

3.3、任意文件上传

代码位置:src/main/java/com/ofsoft/cms/admin/controller/cms/TemplateController.java”文件存在任意文件上传漏洞。

    /**
     * 保存模板
     */
    public void save() {
        String resPath = getPara("res_path");
        File pathFile = null;
        if("res".equals(resPath)){
            pathFile = new File(SystemUtile.getSiteTemplateResourcePath());
        }else {
            pathFile = new File(SystemUtile.getSiteTemplatePath());
        }
        String dirName = getPara("dirs");
        if (dirName != null) {
            pathFile = new File(pathFile, dirName);
        }
        String fileName = getPara("file_name");
        // 没有用getPara原因是,getPara因为安全问题会过滤某些html元素。
        String fileContent = getRequest().getParameter("file_content");
        fileContent = fileContent.replace("&lt;", "<").replace("&gt;", ">");
        File file = new File(pathFile, fileName);
        FileUtils.writeString(file, fileContent);
        rendSuccessJson();
    }

通过FileUtils.writeString(file, fileContent);我们可以写入文件内容;路由地址还是处于@Action(path = "/cms/template");满足参数res_path=res&dirs=%2f&file_name=&file_content=可以写入webshell;通过rendSuccessJson可以了解为json输入我们构造请求:成功写入文件

虽然上传成功但我们这执行命令反馈页面找不到,可见该文件没有执行,我们跟进代码全局搜索json跟进“ src/main/java/com/ofsoft/cms/core/handler/ActionHandler.java ”可以发 现,程序将 jsp、html、json 等后缀都进行了置空,而 static 目录则是直接 return,那么,我们只需将 WebShell 上传至 static 目录即可正常访问,这里我们可以通过路径 穿越的方式将文件写入到其他目录,最终的 Payload 如下:

找到文件,重新给cmd传值执行成功。

3.4、模板注入

代码位置:根据官网介绍知道其模板引擎采用的是 freemarker。根据该模板引擎的语法,我们可 以通过以下方式进行任意代码执行:<#assidn ex="freemarker.template.utility.Execute"?new()>${ex("ipconfig")}

直接在对应的模板文件中加入该代码执行语句,访问该文件查看效果。

3.5、存储型XSS

对于一般的 XSS 漏洞,使用黑盒的手法可以快速地发现存在可控输入/输出的位置及 过滤的关键字。在 ofcms 中通过后台添加公告可以测出一个存在首页的存储型 XSS 漏 洞。

我这总是添加不了。

添加成功效果

代码位置:“admin/controller/ComnController.java”文件中的 update 方法插入后直接做了Db.update操作,和sql注入一样没有做过滤操作。

public void update() {
 Map<String, Object> params = getParamsMap();
 try {
 SqlPara sql = Db.getSqlPara(params.get("sqlid").toString(), params);
 Db.update(sql);
 rendSuccessJson();
 } catch (Exception e) {
 e.printStackTrace();
 rendFailedJson(ErrorCode.get("9999"));
 }
} 
3.6、CSRF漏洞

观察到们前面的所有 POST 操作似乎都没有进行 token 校验;那么就会产生CSRF漏洞,我们直接用burpsuite生成的poc进行验证。

界面:新增用户

生成测试poc,点击使用浏览器测试

新增成功!!

4、思路

代码审计作为安全SDL中开发阶段不可或缺的一部分,作为企业治理需要每个环节将安全考虑进去才可以降低风险的概率;每个环境都应有相应的指导指南和对应的安全工具以及对应的技术来治理软件生命周期的安全问题。(内容用于学习审计相关知识!!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、UI弹窗提示

一、制作弹窗UI 二、创建脚本 1、继承WindowRoot&#xff08;UI基类&#xff09; 获取UI上面的组件 2、初始化 将这个文本失活 3、写一个提示出现的方法 这个派生类中&#xff0c;继承了基类的两个方法&#xff0c;设置显示和设置文本 对应基类的这两个方法 将动画赋值给动…

DDPM - Denoising Diffusion Probabilistic Models 扩散模型

DDPM - Denoising Diffusion Probabilistic Models 扩散模型 扩散模型概述 扩散模型是在模拟图像加噪的逆向过程。也就是在实现一个去噪的过程。简单的来说就包括两个过程组成 前向的扩散过程 Forward Diffusion Process反向扩散过程 Reverse Diffusion Process 下面我们对整个…

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用 专题一、生态系统服务评价技术框架 1.1 生态系统服务概述 1.2 流域生态系统服务的分类与作用 1.3 生态系统服务评估方法 专题二、AI大模型与生态系统服务评价 2.1 目前常用大模型介绍 2…

Java并发 - AQS之ReentrantLock

文章目录 ReentrantLockAQS 队列AbstractOwnableSynchronizerAbstractQueuedSynchronizerNodewaitStatusSHARED/EXCLUSIVE 模式 加锁流程尝试加锁 tryAcquire加锁失败入队addWaiterenq 阻塞等待 acquireQueuedparkAndCheckInterrupt 放弃加锁 cancelAcquire唤醒阻塞线程 unpark…

大语言模型训练

大语言模型训练 1.两大问题2.并行训练2.1数据并行2.2模型并行2.3张量并行2.4混合并行 3.权重计算3.1浮点数3.2混合精度训练3.3deepspeed&#xff08;微软&#xff09;3.3.1 ZeRO3.3.2ZeRO-offload 3.3总结 4.PEFT4.1Prompt TuningPrefix-tuning4.2P-tuning & P-tuning v2 5…

arcpy总结

arcpy 一、是什么二、为什么三、怎么用1、在哪里打开2、基础术语3、代码组织4、案例&#xff08;1&#xff09;裁剪&#xff08;2&#xff09;土地变化特征分析&#xff08;4&#xff09;文件访问与检测&#xff08;5&#xff09;空间数据的查询、插入与更新&#xff08;6&…

伯努利分布(Bernoulli distribution)的两次成功之间间隔次数的分布

伯努利分布&#xff08;Bernoulli distribution&#xff09;是一种特殊的二项式分布&#xff0c;即0-1分布。百科上已经说明了这种分布&#xff0c;即&#xff0c;其中。其数学期望为&#xff0c;方差为。详细说明见0—1分布_百度百科 本文进一步说明对于这类分布的事件&#…

BUUCTF-greatescape1

发现有ftp包和tcp包居多 下载解压是个流量包&#xff0c;使用wiresharh打开&#xff0c;CTRLF&#xff0c;按下图搜索ftp tcp18流发现ssc.key 传送&#xff0c;在19流发现key内容 复制保存为ssc.key, 加载key解密tls&#xff0c;再追踪tls流可得flag INS{OkThatWasWay2Easy} …

微知-Bluefield DPU使用flint烧录固件报错MFE_NO_FLASH_DETECTED是什么?MFE是什么?

文章目录 背景一些报错场景MFE是什么&#xff1f;有哪些MFE 背景 在DPU的fw操作flint的时候&#xff0c;很多命令都会报这个错误&#xff1a;MFE_NO_FLASH_DETECTED&#xff0c;早期很疑惑并且猜测MFE是Mellanox Firmware Engine。实际并不是&#xff0c;具体还得走到mellanox…

linux 中mysql my.cnf 配置模版

前置准备 sudo systemctl stop mysqld 注意&#xff1a; 原本配置重命名做备份 备份数据 删文件 直接新建 my.cnf 把配置 11要粘进去的内容 直接粘进去 注意&#xff1a;尽管log-bin 和 log_bin 都可以启用二进制日志&#xff0c;但为了保持与现代MySQL版本的兼容性和一…

【算法系列-哈希表】两数之和(Map)

【算法系列-哈希表】两数之和 (Map) 文章目录 【算法系列-哈希表】两数之和 (Map)1. 两数之和(LeetCode 1, 梦开始的地方)1.1 思路分析&#x1f3af;1.2 解题过程&#x1f3ac;1.3 代码示例&#x1f330; 2. 四数相加II(LeetCode 454)2.1 思路分析&#x1f3af;2.2 解题过程&am…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

rsync 数据镜像同步服务笔记

1. rsync概述 定义&#xff1a;rsync是一款数据镜像备份工具&#xff0c;支持快速完全备份和增量备份&#xff0c;支持本地复制与远程同步。镜像指两份完全相同的数据备份.特点&#xff1a; 支持整个目录树和文件系统的更新&#xff1b;可选择性地保留符号链接、文件属性、权限…

【Orange Pi 5嵌入式应用编程】-BMP280传感器驱动

BMP280传感器驱动 文章目录 BMP280传感器驱动1、BMP280传感器介绍2、BMP280的测量流程2.1 气压测量2.2 温度测量2.3 IIR滤波2.4 滤波器选择2.5 噪声3、BMP280的功耗模式3.1 休眠模式3.2 强制模式3.3 正常模式3.4 模式转换4、数据读取及计算4.1 寄存器数据覆盖4.2 输出补偿4.3 补…

一键生成证件照的开源利器:HivisionIDPhotos使用教程

HivisionIDPhotos使用教程&#xff1a;一键生成证件照的开源利器 HivisionIDPhotos 是一款开源的、轻量级且高效的AI工具&#xff0c;专注于证件照的自动生成。通过这一工具&#xff0c;用户只需上传一张自拍或其他照片&#xff0c;便能快速生成标准尺寸的证件照&#xff0c;免…

跟李沐学AI:Transformer

Transformer架构 (图源:10.7. Transformer — 动手学深度学习 2.0.0 documentation) 基于编码器-解码器架构来处理序列对 与使用注意力的seq2seq不同&#xff0c;Transformer纯基于注意力 多头注意力&#xff08;Multi-Head Attention&#xff09; (图源:10.5. 多头注意力 …

MyBatis环境配置详细过程

在此之前我们需要知道Maven和依赖是什么。 什么是Maven&#xff1f; Maven 是一个项目管理和构建自动化工具&#xff0c;最初由Apache软件基金会开发&#xff0c;主要用于Java项目的构建、依赖管理、文档生成和发布。Maven使用一种基于XML的配置文件&#xff08;pom.xml&…

vue后台管理系统从0到1(6)引入pinia实现折叠功能

文章目录 vue后台管理系统从0到1&#xff08;6&#xff09;引入pinia实现折叠功能分析&#xff1a;安装并使用 pinia vue后台管理系统从0到1&#xff08;6&#xff09;引入pinia实现折叠功能 分析&#xff1a; 首先&#xff0c;接着上一期&#xff0c;我们项目启动起来应该是…

【算法思想·二叉树】用「遍历」思维解题 II

本文参考labuladongsuanfa笔记[【强化练习】用「遍历」思维解题 II | labuladong 的算法笔记] 如果让你在二叉树中的某些节点上做文章&#xff0c;一般来说也可以直接用遍历的思维模式。 270. 最接近的二叉搜索树值 | 力扣 | LeetCode | 给你二叉搜索树的根节点 root 和一个目…

通信工程学习:什么是SDRAM同步动态随机存取存储器

SDRAM&#xff1a;同步动态随机存取存储器 SDRAM&#xff0c;全称为Synchronous Dynamic Random Access Memory&#xff0c;即同步动态随机存取存储器&#xff0c;是一种广泛应用于计算机和嵌入式系统中的内存技术。以下是对SDRAM的详细介绍&#xff1a; 一、SDRAM的定义与特点…