前言
本系列为【炼石计划@Java代码审计】知识星球实战50套开源系统删减版,也就是每一套分享部分内容给大家学习。如果觉得写得还不错,并且想要从实践中学习JavaWeb代码审计的朋友,欢迎了解加入【炼石计划@Java代码审计】知识星球,与500位志同道合的朋友共同学习成长。
文末获取配套练习环境。
上期回顾
【JavaWeb系统代码审计实战】某RBAC管理系统(一)SpringBoot介绍与项目安装
进入正题
五、漏洞挖掘之代码审计
5.1、信息收集
-
pom.xml漏洞挖掘
基本上所有项目都会根据项目所需引入第三方依赖库来使用,毕竟好用又方便。但如果引入带有漏洞的版本就会出现问题。
通过上面也了解到了,pom.xml
统一管理第三方依赖。通过groupId
,artifactId
,version
三个标识,我们可以了解到使用了哪个依赖库以及版本,从而可以确定是否存在漏洞。
使用Fastjson 1.2.56
版本,该版本存在漏洞,如下图所示:
在发现了第三依赖库存在漏洞版本时,可以进一步利用。
但有时,尽管使用了带有漏洞版本的组件,但并没有使用存在漏洞的相关函数。
比如Fastjson
反序列化漏洞,该项目实际并没有使用到parseObject
。
注意:
通过组件及版本寻找漏洞,最起码需要知道什么组件时干什么的,然后对于常见的组件看多了,也就知道什么版本有什么漏洞了,熟能生巧。
自动化检测第三方依赖包漏洞可使用dependency-check
。
官方地址:
https://owasp.org/www-project-dependency-check/
Github地址:
https://github.com/jeremylong/DependencyCheck
-
查看配置文件
配置文件都在src/main/resources
下面,名字通常为application.yml
或者application.properties
。配置文件中可能会存在数据库或其他组件的连接信息。
数据库连接信息账号密码:
其他配置信息:
5.2、SQL注入漏洞挖掘
本项目基于Mybatis操作数据库。通过前面的学习,我们了解到Mybatis错误的配置会导致SQL注入漏洞的存在,这是我们挖掘SQL注入漏洞的入口点。
我们先来回顾下:
Mybatis拼接sql有下面两种方式:
#{}
告诉 MyBatis 创建一个预编译语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,
${}
仅仅是纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换,直接替换字符串,会导致SQL注入产生。
一些不能使用#{}
的场景:
表名/字段名
order by/group by
like模糊查询
in
因此,我们在代码审计阶段进行SQL注入漏洞挖掘,应关注xxxxMapper.xml
中使用${}
拼接SQL的地方,全局搜索关键字符。Windows快捷键CTRL+SHIFT+F
(如果快捷键冲突,需自己更改)。
调出Find in path
,File mask选择文件类型为*.xml
,键入关键字符${
,如下图所示:
通过上述搜索,发现了SQL语句使用了like
语句并使用$
进行拼接参数,这种情况下无疑是存在SQL注入的。
我们逆向追踪所拼接的参数,看看是从前端哪个地方输入进来的。
首先在IDEA中安装Free Mybatis Plugin
,该插件方便mapper.xml与mapper接口之间跳转。需在左上角File -> Settings -> Plugin
中安装。
逆向追踪参数流程,举例说明
①、通过搜索还发现src/main/resources/mybatis-mappers/DictMapper.xml
文件,第17行,存在使用like
语句以及$
拼接SQL。安装了Free Mybatis Plugin
插件后,左侧会有绿色箭头,点击即可跳转到mapper接口处,也就是DAO层文件,如下图所示:
②、我们继续向前找到谁调用了DictDao.java
中的getFuzzyDictByPage
,Windows系统按住ctrl
键,鼠标左击getFuzzyDictByPage
进入该方法,或者说查看谁用了这个方法。如下图所示:
③、点击进入DICTServiceImpl.java
文件,发现getDictPage
函数中使用了`getFuzzyDictByPage
,如下图所示:
④、继续按住ctrl
键,鼠标左击getDictPage
方法,点击后,直接进入到了DictController
文件中第43行,如下图所示:
找到Controller层后,发现并没有dictname参数,因为Controller中以实体类接收表单数据。进入MyDict
发现该类为实体类,其中定义多个参数,如下图所示:
⑥、经过上述参数逆向追踪,确定了dictName为字典名称
位于查询字典功能
处,接下来我们访问该功能,配合渗透测试进一步挖掘验证SQL注入漏洞。
环境领取
欢迎点击下方链接获取配套练习环境。
【备注,后台回复关键字前八套环境
即可获取不限速下载链接】
炼石计划@Java代码审计
欢迎点击下方链接了解加入【炼石计划@Java代码审计】知识星球,在这里我们专注Java代码审计技术的提升。现阶段正在进行的为50套JavaWeb系统代码审计实战。赶紧和500位志同道合的朋友卷起来吧!
[加入后请务必查看指定文章使用手册]
炼石计划@PHP代码审计
欢迎点击下方链接了解加入【炼石计划@PHP代码审计】知识星球,在这里我们专注PHP代码审计技术的提升。七大阶段学习,让你最终掌握PHP代码审计。抱团学习取暖,避免走弯路,实现弯道超车。
原文始发于微信公众号(闪石星曜CyberSecurity):【JavaWeb系统代码审计实战】某RBAC管理系统(二)信息收集与SQL注入代码审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论