JAVA安全-企业级通用报表平台

举报
亿人安全 发表于 2023/04/27 23:07:30 2023/04/27
【摘要】 环境搭建:代码审计:1.第三方组件漏洞审计2.1 sql注入漏洞本项目使用了Mybatis,来定义SQL。我们主要查看Myabatis中 xxxMapper.xml 文件中是否存在使用 $ 拼接SQL语句的情况。使用 $ 是直接拼接SQL语句的,未进行转义。直接搜索${ 符号,可以发现在src/main/resources/mybatis-mapper/mysql/IgReportMappe...

环境搭建:

代码审计:

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内容。(这里因为字符编码的问

题,本人改成了英文

漏洞复现:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。