Java代码审计项目-某在线教育开源系统
haoteby 2025-07-17 18:38 22 浏览
我们在日常工作中,每次新版本上线前其实都需要先做代码层面的安全审计,在确认代码没有重大安全漏洞后才可以上线。
今天老李给大家分享一个JAVA代码审计的案例,希望能够给大家的工作中提供一点帮助。
当然了,如果项目预算够的话,尽量找第三方的安全机构进行审核,这样更能有针对性的找出未知风险隐患。
目录
前台找回密码处验证码重复利用
XSS
SQL注入
前台用户横向越权
CSRF
前台文件上传getshell
环境部署
- 下载源代码,使用IDEA进行部署,项目pom.xml进行maven依赖包添加、配置数据库账号密码、配置开启端口后即可使用tomcat7插件运行项目。
- 搭建过程遇见两个坑点:
- mysql建议直接使用5.5.*版本的,高版本的会因为mysql的默认配置需要额外配置而遇见各种问题,虽然最后都能搭建成功,但是直接使用低版本的就无需额外配置。
- 项目路径建议直接使用 http://IP:port 形式,后面不要配置额外的路径,加入额外项目配置后虽然可以部署成功,但是会导致一些页面或者图片加载不成功。
- 进行代码审计时,记得需要额外把\src\main\webapp\WEB-INF\lib\目录下的jar包反编译后再进行代码审计,因为使用IDEA进行源码关键字搜索时不会搜索jar包中的代码,我审计之前就没有注意到项目下的这个目录,导致前面审计过程中某些功能找不到源代码。
项目结构分析
这是一个SSM(即Spring Framework、Spring MVC、MyBatis)架构项目。
百科是这样介绍的:
- pom.xml:审计maven项目首先应该查看pom.xm,通过查看此文件可以知道项目用了哪些组件及组件版本,这样可以快速查看组件对应的版本是否有漏洞。
- 观察到项目使用了log4j 且版本为1.2.17,此版本存在反序列化漏洞CVE-2019-17571(经过分析,不存在此漏洞,因为本项目未使用产生此漏洞的类即SocketNode类)。
- 还使用了druid 1.0.1 组件,可以找一些未授权接口(经过测试未发现此组件产生的未授权)。
- mybatis 3.2.7 组件存在反序列化漏洞CVE-2020-26945(经过分析,不存在此漏洞,因为此项目未开启mybatis二级缓存功能)。
- web.xml:程序启动时会先加载这个文件,此文件用来配置Filter、Listener、Servlet。此文件需要重点关注Filter过滤器的全局配置。
此项目只配置了两个全局的过滤器且这两个过滤器都未对输入输出进行转义之类的字符处理,所以未配置全局的XSS过滤。
- applicationContext.xml:spring的默认配置文件,当容器启动时找不到其他指定配置文档时,将加载这个配置文件,此文件也包含引用其他的配置文件。
- spring-mvc.xml:此文件主要的工作是:启动注解、扫描controller包注解;静态资源映射;视图解析(defaultViewResolver);文件上传(multipartResolver);返回消息json配置。
web项目启动时,读取web.xml配置文件,首先解析的是applicationContext.xml文件,其次才是sping-mvc.xml文件。 - Interceptor:拦截器,用于拦截用户请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间。
此项目有3个拦截器,分别对前台用户、后台用户、网站配置管理处的用户是否登录与权限做相应处理。
代码审计
前台找回密码处验证码重复利用
直接在代码中搜索关键字验证码,对相关代码进行分析。
此处是找回密码功能,先后获取客户端与服务端验证码进行校验,校验成功后进入校验邮箱是否注册,若未注册则直接返回结果,未删除服务端中的旧验证码,所以此处可对验证码重复使用来爆破出已经注册的邮箱。
继续分析可知,邮箱存在且重置密码之后才清除服务端中的验证码。因为前台登录处无验证码,所以此处可配合登录处继续密码爆破。
但是经过分析,后台管理员登录处就不存在验证码重复利用,因为验证码校验正确后就会立马进行清除。
XSS
开头已经分析未发现全局的XSS过滤器,所以直接注册账号进行登录,见框就插入XSS payload。
在问答功能下的我要提问功能处发现存储型XSS。
此处只有标题有XSS而内容无XSS,找到对应的入口进行分析原因,
questionsService.addQuestions()为添加问答方法,追踪此方法
QuestionsController-->QuestionsService-->QuestionsServiceImpl-->QuestionsDao-->QuestionsDaoImpl-->QuestionsMapper
根据追踪过程分析未做字符过滤就直接保存到数据库中。并且标题和内容都保存数据库中。
由此可知,存储过程标题和内容未做差异化处理,说明在输出的时候对内容进行了过滤,继续分析输出部分。由以上可知,存在XSS的url为
http://127.0.0.1:8080/question/list。
直接在*.jsp文件中搜索question/list找到对应的输出点。很明显标题处是直接拼接数据库中的值并未使用标签包裹,而内容处则使用了<c:out>标签。在jsp文件中,使用<c:out>标签是直接对代码进行输出而不当成js代码执行。
自此,产生XSS的来龙去脉都已经知道了,所以输出变量时,没有使用<c:out>标签进行防护的都会产生XSS,经分析其他还有多处有XSS。
SQL注入
因为使用的时mybatis框架,所以直接在*Mapper.xml文件中搜索${即可。
发现存在多处使用${}进行拼接的地方,选择一处进行分析
找到对应的controller层入口。此处为后台管理员用户删除文章功能处。
抓取请求包直接使用sqlmap爆破即可。
其他还有几处也存在sql注入。类似分析即可。有几处因为是直接拼接路径中的字符作为参数的,所以这种情况即使使用${}也不会造成sql注入。
前台用户横向越权
在用户修改个人资料时,直接抓包修改 user.userId参数值即可越权登录到其他存在的用户。
分析代码可知,未对用户进行判断就直接把用户信息更新到数据库中,更新数据库中后直接使用userid进行自动重新登录从而可导致直接登录其他用户界面。
CSRF
后台管理员创建用户处存在CSRF漏洞,攻击者可结合此系统的XSS漏洞构造恶意代码从而导致创建系统管理员用户。
可用burpsuite自带的CSRF工具生成payload进行测试。
从代码处可知,未对请求体校验Referer字段,也无token机制。因此可造成CSRF。
前台文件上传getshell
前置知识点
jspx:以xml语法来书写jsp的文件,自定义的映射类型,jspx=jsp+xml;jspx文件本身符合xml的规范,但是它本质又是一个jsp文件,所以在所有jsp里面能够做到的事情在jspx里同样可以做到。
tomcat的web.xml中
org.apache.jasper.servlet.Jspservlet配置关于jsp服务的解析,默认是都会解析jsp和jspx。
此处漏洞发生在前台用户上传头像处。
直接找到源代码进行分析,源码在\src\main\webapp\WEB-INF\lib\inxedu-jar.jar包中。
此处的fileType即为前端传入的文件类型后缀,分析代码可知,此处只过滤了jsp文件其他文件可随意上传,可以上传html文件造成XSS漏洞,由于此项目使用tomcat,所以可以上传jspx文件getshell。
使用哥斯拉工具生成jspx木马上传文件,上传成功。
连接成功。
本文作者:smworld
来源:FreeBuf.COM
相关推荐
- 一日一技:用Python程序将十进制转换为二进制
-
用Python程序将十进制转换为二进制通过将数字连续除以2并以相反顺序打印其余部分,将十进制数转换为二进制。在下面的程序中,我们将学习使用递归函数将十进制数转换为二进制数,代码如下:...
- 十进制转化成二进制你会吗?#数学思维
-
六年级奥赛起跑线:抽屉原理揭秘。同学们好,我是你们的奥耀老师。今天一起来学习奥赛起跑线第三讲二进制计数法。例一:把十进制五十三化成二进制数是多少?首先十进制就是满十进一,二进制就是满二进一。二进制每个...
- 二进制、十进制、八进制和十六进制,它们之间是如何转换的?
-
在学习进制时总会遇到多种进制转换的时候,学会它们之间的转换方法也是必须的,这里分享一下几种进制之间转换的方法,也分享两个好用的转换工具,使用它们能够大幅度的提升你的办公和学习效率,感兴趣的小伙伴记得点...
- c语言-2进制转10进制_c语言 二进制转十进制
-
#include<stdio.h>intmain(){charch;inta=0;...
- 二进制、八进制、十进制和十六进制数制转换
-
一、数制1、什么是数制数制是计数进位的简称。也就是由低位向高位进位计数的方法。2、常用数制计算机中常用的数制有二进制、八进制、十进制和十六进制。...
- 二进制、十进制、八进制、十六进制间的相互转换函数
-
二进制、十进制、八进制、十六进制间的相互转换函数1、输入任意一个十进制的整数,将其分别转换为二进制、八进制、十六进制。2、程序代码如下:#include<iostream>usingna...
- 二进制、八进制、十进制和十六进制等常用数制及其相互转换
-
从大学开始系统的接触计算机专业,到现在已经过去十几年了,今天整理一下基础的进制转换,希望给还在上高中的表妹一个入门的引导,早日熟悉这个行业。一、二进制、八进制、十进制和十六进制是如何定义的?二进制是B...
- 二进制如何转换成十进制?_二进制如何转换成十进制例子图解
-
随着社会的发展,电器维修由继电器时代逐渐被PLC,变频器,触摸屏等工控时代所替代,特别是plc编程,其数据逻辑往往涉及到数制二进制,那么二进制到底是什么呢?它和十进制又有什么区别和联系呢?下面和朋友们...
- 二进制与十进制的相互转换_二进制和十进制之间转换
-
很多同学在刚开始接触计算机语言的时候,都会了解计算机的世界里面大多都是二进制来表达现实世界的任何事物的。当然现实世界的事务有很多很多,就拿最简单的数字,我们经常看到的数字大多都是十进制的形式,例如:我...
- 十进制如何转换为二进制,二进制如何转换为十进制
-
用十进制除以2,除的断的,商用0表示;除不断的,商用1表示余0时结束假如十进制用X表示,用十进制除以2,即x/2除以2后为整数的(除的断的),商用0表示;除以2除不断的,商用1表示除完后的商0或1...
- 十进制数如何转换为二进制数_十进制数如何转换为二进制数举例说明
-
我们经常听到十进制数和二进制数,电脑中也经常使用二进制数来进行计算,但是很多人却不清楚十进制数和二进制数是怎样进行转换的,下面就来看看,十进制数转换为二进制数的方法。正整数转二进制...
- 二进制转化为十进制,你会做吗?一起来试试吧
-
今天孩子问把二进制表示的110101改写成十进制数怎么做呀?,“二进制”简单来说就是“满二进一”,只用0和1共两个数字表示,同理我们平常接触到的“十进制”是“满十进一”,只用0-9共十个数字表示。如果...
- Mac终于能正常打游戏了!苹果正逐渐淘汰Rosetta转译
-
Mac玩家苦转译久矣!WWDC2025苹果正式宣判Rosetta死刑,原生游戏时代终于杀到。Metal4光追和AI插帧技术直接掀桌,连Steam都连夜扛着ARM架构投诚了。看到《赛博朋克2077》...
- 怎么把视频的声音提出来转为音频?音频提取,11款工具实测搞定
-
想把视频里的声音单独保存为音频文件(MP3/AAC/WAV/FLAC)用于配音、播客、听课或二次剪辑?本文挑出10款常用工具,给出实测可复现的操作步骤、优缺点和场景推荐。1)转换猫mp3转换器(操作门...
- 6个mp4格式转换器测评:转换速度与质量并存!
-
MP4视频格式具有兼容性强、视频画质高清、文件体积较小、支持多种编码等特点,适用于网络媒体传播。如果大家想要将非MP4格式的视频转换成MP4的视频格式的话,可以使用MP4格式转换器更换格式。本文分别从...