Java代码审计
参考链接
java代码审计之路 - Afant1 - 博客园 (cnblogs.com)
✍内容
Java环境配置
java1.8+idea+tomcat
IDEA常用快捷键
F7步入|F8步过|F9到下一个断点|ALT+F8评估表达式|Ctrl+F 文件内查找字符串|双击Shift 查找任何内容,可搜索类、资源、配置项、方法等,还能搜索路径|Ctrl + N 按类名搜索类|Ctrl + F12 查看当前类结构|Ctrl + H 查看类的层次关系|Alt + F7 查找类或方法在哪被使用
下载地址
java+idea+tomcat自己找
项目新建
新建一个标准项目
在项目结构中配置JDK,然后在模块中选择新建web
然后添加artifacts
然后文件配置按照如下
然后设置就已经好了,但是java版本需要下最新版本的
javaweb基础
servlet
java服务模块,主要的业务逻辑就是用的这个模块
idea的servlet一般是继承httpservlet类
Filter
过滤器模块
创建TargetFilter类:
要点1:实现
javax.servlet.Filter接口要点2:在
doFilter()方法中执行过滤要点3:如果满足过滤条件使用
chain.doFilter(request, response);放行要点4:如果不满足过滤条件转发或重定向请求
- 附带问题:Thymeleaf模板渲染。这里我们选择的解决办法是跳转到一个Servlet,由Servlet负责执行模板渲染返回页面。
listener
监听器
用于监听Web应用程序中的ServletContext,HttpSession 和HttpServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
Thymeleaf
Thymeleaf是一种模板引擎,直接在html中的任意标签前面加上th:即可在后端修改其值
详细的用法可以参考官网、
Vue
Ajax
在实际应用中Ajax指的是:不刷新浏览器窗口,不做页面跳转,局部更新页面内容的技术。
使用原生的JavaScript程序执行Ajax极其繁琐,所以一定要使用框架来完成。而Axios就是目前最流行的前端Ajax框架。
使用Axios和使用Vue一样,导入对应的*.js文件即可。官方提供的script标签引入方式为:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
Java远程调试Behinder.jar
首先在命令行中输入如下
1 | java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10.194.7.167:5005 Behinder.jar |
然后去idea中新建一个项目,添加远程调用的配置
然后将jar包添加到库,打上断点即可调试
源码
https://github.com/super9du/vhr-backend/tree/master
https://github.com/JoyChou93/java-sec-code
审计思路
参考链接:https://xz.aliyun.com/t/9173
确定系统框架
Struts1
查看web.xml,里面有一个servlet内容如下
1
2
3<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>它的路由会出现在
<init-param>中的<param-value>中的配置文件中

例如struts-config.xml中的一个action如下

path就是路由,type就是服务代码
Struts2
参考:https://xz.aliyun.com/t/9173
- 查看web.xml,查看filter,里面会有名为struts的过滤器
struts.xml文件
这个文件中有action的具体java文件路径信息
层次介绍
action为业务逻辑处理层,action层接收来自视图层(.jsp(可以理解为前端吧,就是用户看到操作的那层))的请求,并接收请求参数,同时负责调用模型Model层方法来完成业务逻辑的处理,最后控制程序的流程,选择一个合适的视图,将结果显示给用户,一般这个目录下文件的特征表现为xxxxaction.java,比如NovyAction.java;
dao为数据持久层,在这层中通常是用来做数据库请求处理的,增删查改都在这里,一般这个目录下文件的特征表现为xxxxDao.java,比如NovyDao.java。
在web运行处理请求时流程为业务逻辑处理层-数据持久层
SpringMVC
先查看web.xml,里面会有springMVC
查看Springmvc.xml
查找各种controller类所在的位置查看pom.xml
各种依赖的引入
层次结构
controller为控制层(业务逻辑),用来接收客户端的请求,然后调用Service层业务逻辑,获取到数据,传递数据给视图层(客户端)用于视觉呈现,一般请求的url在这里,比如
@Controller
@RequestMapping(value = “/novy”)
则请求url为http://localhost/novy
控制层的文件一般为xxxcontroller.java,比如NovyController.java
Service是业务层,接收Controller层数据,与DAO/Mapper层交互,处理业务逻辑,生成responseDTO数据并返回Controller层 ,该层文件一般为xxxServce.java,比如NovyService.java,此处是接口定义,就是定义一些方法,没有这些方法的实现,但是有时候数据操作会在这里发生(看开发)
Implements是服务实现层(接口实现),用来处理一些方法的实现(这个方法干了啥干了啥),该层文件一般为xxxImpl.java,比如NovyImpl.java,impl 是把mapper和service进行整合的文件,有时候一些sql操作也会发生在这里
Mapper是数据持久层,对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,数据持久层文件通常都是xxxMapper.xml,比如NovyMapper.xml
Dao是数据接口层,一些数据请求(接口)会在这里发生(一般用于内部实现)
Entity是实体处理层,用于存放我们的实体类,与数据库中的属性值基本保持一致(定义前端传来的请求参数)
在web运行时处理请求的流程为Controller->Service->impl->mapper
Springboot
和springmvc差不多
SSH框架
struts2+spring+hibernate
寻找sql注入漏洞
mybatis框架
mybatis一般是使用#{进行预编译,但是在order by的情况下必须使用${直接拼接,或者是一些其他情况使用了${,就可能会出现sql注入的问题
这里使用ruoyi框架为例子
审计方法
- 全局搜索
${,文件类型限定为xml
![[Pasted image 20241019145616.png]]
如上图,直接点进去一个mapper文件查看即可
这里进入SysRoleMapper.xml文件
![[Pasted image 20241019150554.png]]
select标签中的id的值selectRoleList就是用到该mapper的方法
parameterType的值SysRole就是需要传入的参数对象
然后就需要往上寻找入口点
- 寻找定义selectRoleList方法的java文件
xml文件一般是在resource/mapper文件夹中,对应的mapper在java源代码的mapper文件夹中
正常来说直接使用ctrl+点击方法名就可以跳转到源文件,若是没有的话可以使用搜索功能找到定义该函数的mapper类型的java文件,如下第一个就是
![[Pasted image 20241019151404.png]]
找到impl实现文件
直接ctrl+单击即可
![[Pasted image 20241019151503.png]]寻找接口文件
既然有实现文件,那么肯定也有接口文件,直接点击ctrl+u就可以跳转到寻找入口文件(controller)
使用搜索功能,直接搜索selectRoleList方法,找到cotroller类型的文件
![[Pasted image 20241019152031.png]]
SysRoleController.java文件内容如下
![[Pasted image 20241019152145.png]]
- 可以看到根路由是
/system/role
对应的get方法的路由是/list,然后里面有参数role,可以看到role的类型是SysRole
- 搜索参数定义
全局搜索SysRole的定义文件
![[Pasted image 20241019152823.png]]
SysRole.java文件
![[Pasted image 20241019153112.png]]
可以发现,直接获取值,并且没有做任何的过滤
- 快捷方法
抓到xml文件中的可能的注入点后,直接使用搜索功能,找到使用对应的方法的controller类型的文件,和对应的参数类型的java文件,然后直接进行分析即可
- 寻找后端地址
若是有在线的项目,直接抓包登录看一下就知道了,还可以从源码中的application.yml文件中查看,或者是vue的vue.config.js文件中
![[Pasted image 20241019154933.png]]
通过以上的分析,可以得出漏洞存在的路径是
1 | 127.0.0.1:8086/system/role/list?roleId=1&roleName-admin&roleKey=1¶ms[dataScope]=and+updatexml(1,concat(0x7e,(SELECT+version()),0x7e),1)%2523 |
params[dataScope]这种形式是因为xml文件中定义是${params.dataScope}
Hibernate框架
Hibernate框架一般没有sql注入漏洞,一般都是使用占位符的
审计方法
- 关键词检索
1
@Query
搜索完后,查看是否是使用占位符,若是直接拼接的话就是有漏的的
若是找到有漏洞的sql查询语句,使用如下方法跟踪到controller层
假设寻找findall方法
ctrl+左键单击进入实现类
然后ctrl+左键点击上一层的方法findSide转到controller类


可以发现接口是core/task/view.do





