JAVA代码审计-企业级通用报表平台
环境搭建:
代码审计:
1.第三方组件漏洞审计
2.1 sql注入漏洞
本项目使用了Mybatis,来定义SQL。我们主要查看Myabatis中 xxxMapper.xml 文件中
是否存在使用 $ 拼接SQL语句的情况。使用 $ 是直接拼接SQL语句的,未进行转义。
直接搜索${ 符号,可以发现在src/main/resources/mybatis-
mapper/mysql/IgReportMapper.xml中,有一个未预处理的sql
之后往上追到dao层,com/lyl/igreport/dao/mysql/IgReportDao.java,可以发现
queryMysql()方法
继续追到Service层,com/lyl/igreport/service/impl/CommonReportServiceImpl.java可
以发现在36行通过@Autowired给mysqlDao自动注入,最后在(queryDataSourceData方
法内)55行进行调用dao层中的queryMysql()方法。
最终在(图1)Controller层中 com/lyl/igreport/web/controller/JobInfoController.java
triggerJob方法中89行进行接收参数。
并在95行中会调用到(图2)com/lyl/igreport/service/jobhandler/CommonReportHandler.java类中第40行的commonReportService.queryDataSourceData方法,而该方法就是上方中的Service层
(CommonReportServiceImpl类)的代码,进入该Service层就会执行IgReportDao类(Dao
层)的queryMysql()方法从而造成SQL注入。
图1
3.存储xss漏洞
由于该项目采用Springboot+vue的整合,所以XSS的希望渺茫,但是在下方的目录中发现了index.html,所以列出了两种可能 1. index.html会不会存在XSS 2. 在审计SQL注入的时候,发现了CommonReportServiceImpl类中使用了XxlJobLogger.log()将内容进行输出到页面。
但是在此之前,我们需要关注一个很重要的点,有没有整合Filter和拦截器,在Filter或拦截器中有没有过滤?直接搜索 HandlerInterceptorAdapter即可,最终定位到com/lyl/igreport/xxljob/controller/interceptor整合了拦截器,可以发现在拦截器中,没有发现对输入的字符进行过滤。
正式审计过程,在com/lyl/igreport/web/controller/ReportInfoController.java
addCommonReport()方法接收了一个CommonReportDto类作为参数传入,而传入之后
会调用到(Service层)jobService.add方法。进行将数据添加。
添加之后,在com/lyl/igreport/web/controller/JobInfoController.java triggerJob()方法
中的95行会进行将参数当做任务添加执行。
添加成任务的操作。
后续的内容,也是任务日志的添加
添加完任务日志之后,在com/lyl/igreport/web/controller/JobLogController.java
logDetailCat()方法的
93行中,logResult.getContent()记录的就是日志内容。
由于该类声明为@RestController,所以会最终将logResult回显到页面
漏洞复现
4.越权漏洞
在登录的时候发现了 "登录成功" 四个字,于是乎全局搜索,最终在
static/static/js/chunk-26f4e2ec.1b375821.js发现了登录的校验功能。简单看了下逻辑。
可以发现如果将msg改为null,则会登录成功。而这个msg,就是登录之后,回显的json
数据。
在拦截器中,未发现拦截之后。继续看后端是如何校验的,上图中,post的地址
为/api/login,最终得知位置在
com/lyl/igreport/web/controller/IndexController.java loginDo()方法内,同时73行会将
用户输入的账号和密码进行传入(Service层) LoginService.login()方法
在 LoginService.login()方法中,可以看到没有对用户名做校验,而是稍后对密码进行了
校验,所以瞎输入密码之后,肯定会断点在54行中。
细节继续探究,在LoginService.login()的54行使用了
I18nUtil.getString("login_param_unvalid"),所以全局搜索login_param_unvalid得知,他
是配置文件中的一个参数,同时也是response回显的msg内容。(这里因为字符编码的问
题,本人改成了英文
漏洞复现:
5.我的任务-越权获取他人任务信息漏洞
代码审计:
漏洞复现:
- 点赞
- 收藏
- 关注作者
评论(0)