参考链接

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
2
127.0.0.1:8086/system/role/list?roleId=1&roleName-admin&roleKey=1&params[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