java代审那些笔记之若只如初见
字数 2511 2025-08-06 18:08:09

Java代码审计全面指南

一、Java审计基础概念

1.1 Java代码审计定义

Java代码审计是通过阅读Java源代码或反编译后的字节码,发现应用程序中可能存在的安全问题。由于Java是编译型语言,即使只有class文件也可以进行审计。

1.2 Java编译过程

Java源代码 → Java字节码 → 机器码

字节码优势

  • 高效
  • 可移植性高

1.3 反编译工具

  • IDEA默认使用Fernflower
  • jad
  • jd-gui
  • 安卓反编译工具:JD-GUI、Procyon-Decompiler、jadx、Apktool等

二、Java审计学习路径

2.1 初级阶段

  1. 环境搭建:JDK、MySQL、Maven、Tomcat等
  2. Java基础
    • 反射机制
    • 动态代理机制
    • 设计模式
  3. Java Web学习
    • Request & Response
    • Filter
    • Servlet、SSH、SSM框架
    • Struts2、SpringMVC、SpringCloud
  4. 常规漏洞审计
    • SQL注入
    • 文件处理类漏洞
    • XSS
    • 配置错误

2.2 中级阶段

  1. JDK安全特性:序列化/反序列化
  2. 常见gadget:ysoserial、Marshaller、jdk 7u21、jndi、URLDNS
  3. 高级漏洞
    • JNDI注入
    • 表达式注入
    • 反序列化漏洞(RCE、文件上传、XXE、DOS等)
    • XXE、SSRF
    • 协议漏洞
    • 逻辑漏洞

2.3 高级阶段

  1. 底层安全机制:JEP 290等
  2. 安全防护技术:RASP、IAST
  3. 自动化审计:CodeQL等
  4. 漏洞研究:容器安全、服务器安全、漏洞挖掘

三、审计工具详解

3.1 静态分析工具

  1. Fortify SCA

    • 五大分析引擎:数据流、语义、结构、控制流、配置流
    • 优点:速度快、精确、支持多语言
    • 缺点:集成性差
  2. Checkmarx

    • 优点:规则自定义、集成性强
    • 缺点:速度慢、精确率一般、支持语言少
  3. CodeQL

    • 类似SQL的查询语言
    • 支持C/C++、C#、Golang、Java等
    • 非商业开源半自动化工具

3.2 其他工具

  • JavaID:Java源码静态分析
  • 代码卫士:缺陷检测
  • Dependency Check:第三方库漏洞检测
  • FindSecBugs:IDEA插件,检测安全漏洞
  • ChatGPT:辅助代码解读和审计

四、Java审计环境搭建

4.1 基础环境

  • JDK:推荐JDK8/JDK11
  • 数据库:MySQL、Oracle等
  • Web容器:Tomcat、WebLogic等
  • 项目管理:Maven、Gradle
  • IDE:IDEA(推荐)、Eclipse

4.2 JDK安装与配置

  1. 环境变量

    • JAVA_HOME:JDK安装路径
    • Path:添加%JAVA_HOME%\bin
    • CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
  2. 版本切换:可通过脚本实现多版本切换

4.3 Maven配置

  1. pom.xml核心元素

    • project:根元素
    • modelVersion:POM模型版本(4.0.0)
    • dependencies:依赖管理
    • build:构建配置
  2. 加速配置:修改settings.xml使用国内镜像

五、IDEA调试技巧

5.1 调试基础

  1. 调试按钮

    • F7:步入
    • F8:步过
    • F9:恢复程序
    • Alt+F8:评估表达式
  2. 调试窗口

    • Variables:查看变量
    • Watches:监控特定变量
    • Frames:调用栈

5.2 断点类型

  1. 行断点:最基本断点类型
  2. 方法断点:在方法入口/出口处中断
  3. 字段断点:监控字段访问/修改
  4. 异常断点:异常发生时中断
  5. 临时断点:只中断一次

5.3 远程调试

  1. 服务端启动参数

    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${debug_port} demo.jar
    
  2. IDEA配置

    • "Edit Configurations" → "Remote"
    • 配置对应IP和端口

六、漏洞调试实例

6.1 Log4j漏洞调试

  1. 触发路径

    • Logger.error() → logIfEnabled → logMessage → 格式化处理 → JNDI查找
  2. 关键点

    • StrSubstitutor.replace()处理${}表达式
    • Interpolator.lookup()解析JNDI查找
    • JndiManager.lookup()执行实际查找

6.2 调试技巧

  1. 条件断点:设置表达式条件
  2. 断点日志:不中断程序记录信息
  3. 方法追踪:通过调用栈分析流程

七、参考资料

7.1 学习资源

  • Java Web安全:https://www.javasec.org/
  • Java安全总结:https://github.com/Maskhe/javasec/
  • Spring Boot漏洞:https://github.com/LandGrey/SpringBootVulExploit

7.2 漏洞库

  • Snyk漏洞库:https://security.snyk.io/vuln
  • CNVD:https://www.cnvd.org.cn/flaw/list
  • Tide漏洞情报平台:http://vul.tidesec.com/

7.3 标准规范

  • 《Java语言源代码漏洞测试规范》GB/T 34944-2017
  • Cert Java国际规范

八、实战项目推荐

  1. 迷你天猫商城:完整电商系统
  2. Java-sec-code:漏洞示例集合
  3. SecExample:Java漏洞靶场
  4. Hello-Java-Sec:结合漏洞代码和安全编码的示例

九、审计注意事项

  1. 版本兼容性:注意JDK版本对漏洞的影响
  2. 设计模式理解:许多漏洞利用涉及设计模式
  3. 工具链掌握:熟练使用marshalsec和ysoserial
  4. 自动化与手动结合:工具扫描+人工验证
  5. 持续学习:关注新出现的漏洞和防护技术

通过系统性地掌握这些知识和技能,可以逐步提升Java代码审计的能力,从基础漏洞发现到复杂漏洞挖掘,最终实现全面的安全审计能力。

Java代码审计全面指南 一、Java审计基础概念 1.1 Java代码审计定义 Java代码审计是通过阅读Java源代码或反编译后的字节码,发现应用程序中可能存在的安全问题。由于Java是编译型语言,即使只有class文件也可以进行审计。 1.2 Java编译过程 Java源代码 → Java字节码 → 机器码 字节码优势 : 高效 可移植性高 1.3 反编译工具 IDEA默认使用Fernflower jad jd-gui 安卓反编译工具:JD-GUI、Procyon-Decompiler、jadx、Apktool等 二、Java审计学习路径 2.1 初级阶段 环境搭建 :JDK、MySQL、Maven、Tomcat等 Java基础 : 反射机制 动态代理机制 设计模式 Java Web学习 : Request & Response Filter Servlet、SSH、SSM框架 Struts2、SpringMVC、SpringCloud 常规漏洞审计 : SQL注入 文件处理类漏洞 XSS 配置错误 2.2 中级阶段 JDK安全特性 :序列化/反序列化 常见gadget :ysoserial、Marshaller、jdk 7u21、jndi、URLDNS 高级漏洞 : JNDI注入 表达式注入 反序列化漏洞(RCE、文件上传、XXE、DOS等) XXE、SSRF 协议漏洞 逻辑漏洞 2.3 高级阶段 底层安全机制 :JEP 290等 安全防护技术 :RASP、IAST 自动化审计 :CodeQL等 漏洞研究 :容器安全、服务器安全、漏洞挖掘 三、审计工具详解 3.1 静态分析工具 Fortify SCA : 五大分析引擎:数据流、语义、结构、控制流、配置流 优点:速度快、精确、支持多语言 缺点:集成性差 Checkmarx : 优点:规则自定义、集成性强 缺点:速度慢、精确率一般、支持语言少 CodeQL : 类似SQL的查询语言 支持C/C++、C#、Golang、Java等 非商业开源半自动化工具 3.2 其他工具 JavaID :Java源码静态分析 代码卫士 :缺陷检测 Dependency Check :第三方库漏洞检测 FindSecBugs :IDEA插件,检测安全漏洞 ChatGPT :辅助代码解读和审计 四、Java审计环境搭建 4.1 基础环境 JDK :推荐JDK8/JDK11 数据库 :MySQL、Oracle等 Web容器 :Tomcat、WebLogic等 项目管理 :Maven、Gradle IDE :IDEA(推荐)、Eclipse 4.2 JDK安装与配置 环境变量 : JAVA_ HOME:JDK安装路径 Path:添加%JAVA_ HOME%\bin CLASSPATH:.;%JAVA_ HOME%\lib;%JAVA_ HOME%\lib\dt.jar;%JAVA_ HOME%\lib\tools.jar 版本切换 :可通过脚本实现多版本切换 4.3 Maven配置 pom.xml核心元素 : project:根元素 modelVersion:POM模型版本(4.0.0) dependencies:依赖管理 build:构建配置 加速配置 :修改settings.xml使用国内镜像 五、IDEA调试技巧 5.1 调试基础 调试按钮 : F7:步入 F8:步过 F9:恢复程序 Alt+F8:评估表达式 调试窗口 : Variables:查看变量 Watches:监控特定变量 Frames:调用栈 5.2 断点类型 行断点 :最基本断点类型 方法断点 :在方法入口/出口处中断 字段断点 :监控字段访问/修改 异常断点 :异常发生时中断 临时断点 :只中断一次 5.3 远程调试 服务端启动参数 : IDEA配置 : "Edit Configurations" → "Remote" 配置对应IP和端口 六、漏洞调试实例 6.1 Log4j漏洞调试 触发路径 : Logger.error() → logIfEnabled → logMessage → 格式化处理 → JNDI查找 关键点 : StrSubstitutor.replace()处理${}表达式 Interpolator.lookup()解析JNDI查找 JndiManager.lookup()执行实际查找 6.2 调试技巧 条件断点 :设置表达式条件 断点日志 :不中断程序记录信息 方法追踪 :通过调用栈分析流程 七、参考资料 7.1 学习资源 Java Web安全:https://www.javasec.org/ Java安全总结:https://github.com/Maskhe/javasec/ Spring Boot漏洞:https://github.com/LandGrey/SpringBootVulExploit 7.2 漏洞库 Snyk漏洞库:https://security.snyk.io/vuln CNVD:https://www.cnvd.org.cn/flaw/list Tide漏洞情报平台:http://vul.tidesec.com/ 7.3 标准规范 《Java语言源代码漏洞测试规范》GB/T 34944-2017 Cert Java国际规范 八、实战项目推荐 迷你天猫商城 :完整电商系统 Java-sec-code :漏洞示例集合 SecExample :Java漏洞靶场 Hello-Java-Sec :结合漏洞代码和安全编码的示例 九、审计注意事项 版本兼容性 :注意JDK版本对漏洞的影响 设计模式理解 :许多漏洞利用涉及设计模式 工具链掌握 :熟练使用marshalsec和ysoserial 自动化与手动结合 :工具扫描+人工验证 持续学习 :关注新出现的漏洞和防护技术 通过系统性地掌握这些知识和技能,可以逐步提升Java代码审计的能力,从基础漏洞发现到复杂漏洞挖掘,最终实现全面的安全审计能力。