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 初级阶段
- 环境搭建: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 远程调试
-
服务端启动参数:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${debug_port} demo.jar -
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代码审计的能力,从基础漏洞发现到复杂漏洞挖掘,最终实现全面的安全审计能力。