环境搭好,IDEA的调试技巧
Java代码审计建议同时准备两个版本:
| 版本 | 用途 | 下载地址 |
|---|---|---|
| JDK 8 | 运行老旧项目、反序列化漏洞环境(很多漏洞只存在于JDK8) | Oracle官网或OpenJDK |
| JDK 11/17 | 运行现代SpringBoot项目 | OpenJDK |
建议先装JDK 8,因为小迪安全的文档里很多漏洞环境都是基于JDK 8的。
下载建议:直接去 Adoptium(原AdoptOpenJDK)下载,免费且无需Oracle账号。
安装完成后,配置系统环境变量:
1. 右键"此电脑" → 属性 → 高级系统设置 → 环境变量 2. 在"系统变量"中新建: 变量名:JAVA_HOME 变量值:C:\Program Files\Eclipse Adoptium\jdk-8.0.xxx(你的安装路径) 3. 编辑Path变量,新增两条: %JAVA_HOME%\bin %JAVA_HOME%\jre\bin 4. 新建CLASSPATH变量: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
验证:打开CMD,输入:
bashjava -version javac -version
能看到版本号即成功。
审计时经常需要在JDK 8和11之间切换,建议用脚本或IDEA自带的JDK管理功能,不必反复改环境变量。
IDEA中切换JDK:File → Project Structure → SDKs → 添加多个JDK路径 → 在Project/Module中随时切换。
下载地址:https://www.jetbrains.com/idea/download/
| 版本 | 说明 |
|---|---|
| Ultimate(旗舰版) | 功能最全,支持Spring、JavaEE、数据库工具,建议用这个 |
| Community(社区版) | 免费,但缺少Spring和Web支持,不适合审计 |
学生/教育优惠:用.edu邮箱可申请免费正版授权。没有的话,官网有30天试用。
安装时的勾选建议:
打开IDEA后,按以下步骤配置:
1. 主题与字体
File → Settings → Appearance & Behavior → Appearance → Theme: Darcula(暗色主题,护眼) File → Settings → Editor → Font → Font: JetBrains Mono(专为代码设计的等宽字体) → Size: 14-16(看个人视力)
2. 编码设置(极其重要,防止中文乱码)
File → Settings → Editor → File Encodings → Global Encoding: UTF-8 → Project Encoding: UTF-8 → Default encoding for properties files: UTF-8 → 勾选 Transparent native-to-ascii conversion
3. 自动导入
File → Settings → Editor → General → Auto Import → 勾选 Add unambiguous imports on the fly(自动导包) → 勾选 Optimize imports on the fly(自动删无用导包)
4. 代码折叠(审计时看代码更清爽)
File → Settings → Editor → General → Code Folding → 取消勾选 Imports(不要折叠导入语句,审计时要看有没有引入危险类)
第一次打开项目,你需要认识这几个区域:
┌─────────────────────────────────────────────────────┐ │ 菜单栏 (File/Edit/View...) │ ├──────────┬────────────────────────────┬─────────────┤ │ │ │ │ │ 项目结构 │ 代码编辑区 │ 结构/大纲 │ │ (Project) │ (Editor) │ (Structure) │ │ -src │ │ │ │ -pom.xml│ │ │ │ │ │ │ ├──────────┴────────────────────────────┴─────────────┤ │ 工具窗口 (Terminal/Maven/Database/Run...) │ └─────────────────────────────────────────────────────┘
常用窗口开关:
Alt + 1:打开/关闭项目结构窗口Alt + 4:打开/关闭Run控制台Alt + F12:打开/关闭Terminal(命令行)Ctrl + Shift + A:万能搜索(找不到功能时按这个)Maven是Java项目的依赖管理工具,类似于Python的pip、Node的npm。审计时你看到pom.xml,就是Maven的配置文件,里面列出了项目用到了哪些第三方组件(比如FastJson、SpringBoot的版本号)。
1. 下载
地址:https://maven.apache.org/download.cgi
下载 apache-maven-3.9.x-bin.zip,解压到无中文路径的目录。
2. 配置环境变量
新建系统变量 MAVEN_HOME = D:\apache-maven-3.9.x 编辑Path,添加 %MAVEN_HOME%\bin
3. 验证
bashmvn -v
Maven默认从中央仓库下载依赖,速度极慢。需要配置阿里云镜像。
编辑 conf/settings.xml(在Maven安装目录下):
xml<settings>
<!-- 配置本地仓库路径(所有下载的jar包会存在这里) -->
<localRepository>D:/maven-repo</localRepository>
<mirrors>
<!-- 阿里云镜像 -->
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
File → Settings → Build, Execution, Deployment → Build Tools → Maven → Maven home path: 选择你的Maven安装目录 → User settings file: 选择 conf/settings.xml → Local repository: 选择你的本地仓库目录
关键概念:当你打开一个审计项目时,IDEA会自动读取pom.xml,然后下载所有依赖。右下角会出现进度条,等它跑完再开始审计,否则代码里会有很多红色报错(类找不到)。
Tomcat是Java Web应用的运行容器。审计时你需要把目标项目跑起来,才能动态调试。
地址:https://tomcat.apache.org/download-90.cgi
下载 zip 格式,解压即可(绿色软件,无需安装)。
版本选择:

然后这里根据小迪安全的默认都不选,进入项目

点击运行,就启动了

1. 打开你的Java Web项目 2. 点击右上角 "Add Configuration"(或 Run → Edit Configurations) 3. 点击 "+" → 选择 "Tomcat Server" → "Local" 4. 在Server标签页: - Application server: 点击Configure,选择Tomcat解压目录 - JRE: 选择你的JDK 8 - HTTP port: 8080(默认) 5. 在Deployment标签页: - 点击 "+" → Artifact → 选择 xxx:war exploded - Application context: /(或 /项目名) 6. 点击OK
启动:点击右上角的绿色三角按钮(或Shift+F10),看到控制台输出 Server startup in xxx ms 即成功。
访问:浏览器打开 http://localhost:8080/
审计学习需要大量下载开源项目和漏洞环境,Git是必备技能。
地址:https://git-scm.com/download/win 安装时一路Next即可。
bash# 克隆(下载)一个项目到本地
git clone https://github.com/xxx/xxx.git
# 查看当前项目的状态
git status
# 查看提交历史(审计时看漏洞修复记录很有用)
git log --oneline
# 切换到某个历史版本(复现漏洞时常用)
git checkout <commit-id>
# 切换回最新代码
git checkout main
审计中的应用场景:
git clone 下载到本地git log 查看开发者是怎么修复的,对比学习IDEA插件能大幅提升审计效率,以下是必装清单:
| 插件名 | 作用 | 安装方式 |
|---|---|---|
| Find Security Bugs | 静态安全分析,自动标记潜在的SQL注入、XSS、反序列化等漏洞 | Settings → Plugins → Marketplace搜索 |
| .env files support | 高亮显示.env配置文件,方便找硬编码密钥 | Plugins Marketplace |
| String Manipulation | 快速解码/编码(Base64、URL、Hex),审计时处理Payload很方便 | Plugins Marketplace |
Find Security Bugs 使用:
安装后,右键项目 → Find Security Bugs → Analyze Security,会在底部Analyze窗口显示潜在漏洞。
⚠️ 注意:插件只是辅助,不能替代人工审计,会有误报和漏报。
| 插件名 | 作用 |
|---|---|
| Rainbow Brackets | 彩虹括号,嵌套代码一眼看清层级 |
| Key Promoter X | 提示你当前操作用快捷键怎么做,帮你记住快捷键 |
| Chinese (Simplified) Language Pack | 中文语言包(新手可选,但建议用英文,审计文档都是英文) |
| Maven Helper | 可视化解决Maven依赖冲突 |
这是本文最重要的部分。代码审计不是"看代码猜漏洞",而是"打断点 → 跟踪数据流 → 确认漏洞"。
先记住这5个快捷键,审计时90%的时间都在用它们:
| 快捷键 | 名称 | 作用 |
|---|---|---|
F7 | Step Into | 步入:进入当前行调用的方法内部 |
F8 | Step Over | 步过:执行当前行,不进入方法内部 |
F9 | Resume | 继续:跑到下一个断点,或跑完程序 |
Shift+F8 | Step Out | 步出:从当前方法跳出,回到调用处 |
Alt+F9 | Run to Cursor | 运行到光标:直接运行到鼠标所在行 |
1. 普通断点 在代码行号左侧单击,出现红色圆点。程序运行到这里会暂停。
2. 条件断点(极其重要) 右键红色断点,输入条件表达式。只有当条件满足时才会暂停。
应用场景:某个方法被调用100次,你只想看参数等于"admin"的那一次 条件:username.equals("admin")
3. 异常断点
Run → View Breakpoints (Ctrl+Shift+F8) → 点击 "+" → Java Exception Breakpoints 输入:java.lang.RuntimeException
作用:当程序抛出指定异常时自动暂停,非常适合找反序列化漏洞的触发点。
Debug模式下,下方会出现Debug工具窗口,重点关注这几个区域:
┌────────────────────────────────────────────┐ │ Frames(调用栈) │ │ - main() │ │ - doFilter() │ │ - processRequest() ← 当前在这里 │ │ - executeSQL() │ ├────────────────────────────────────────────┤ │ Variables(变量) │ │ - username = "admin' or '1'='1" │ │ - sql = "select * from user where..." │ ├────────────────────────────────────────────┤ │ Watches(监视表达式) │ │ - username.contains("or") → true │ └────────────────────────────────────────────┘
Frames(调用栈):显示当前代码是怎么被一层层调用过来的。审计时从这里倒推漏洞入口。
Variables(变量):查看当前作用域内的所有变量值。审计时确认用户输入是否到达了危险函数。
Watches:添加自定义表达式,实时监控某个值的变化。
假设你在审计一个登录功能,怀疑有SQL注入:
java// UserDao.java
public User login(String username, String password) {
String sql = "select * from user where username = '" + username + "'";
// 你在这里打个断点
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
...
}
调试步骤:
String sql = ... 这一行打普通断点admin' or '1'='1,点击登录username = "admin' or '1'='1"(用户输入,可控)sql = "select * from user where username = 'admin' or '1'='1'"(已拼接进SQL)F8 步过,看到 executeQuery(sql) 执行了这条恶意SQL有时候目标部署在远程服务器上,你需要连接过去调试:
1. 远程启动Java时加参数: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 2. IDEA中:Run → Edit Configurations → "+" → Remote JVM Debug - Host: 远程IP - Port: 5005 3. 点击Debug按钮连接
拿到一个审计目标(比如小迪安全提供的源码),按这个顺序操作:
1. 解压项目,观察根目录: - 有pom.xml → Maven项目 - 有build.gradle → Gradle项目 - 有src文件夹但没有pom.xml → 可能是普通Java项目 2. IDEA中:File → Open(或 New → Project from Existing Sources) 选择项目根目录 3. 如果是Maven项目: - 右下角弹出"Maven projects need to be imported",点击Import Changes - 等待依赖下载完成(看底部进度条) 4. 配置Project Structure: File → Project Structure (Ctrl+Alt+Shift+S) - Project SDK: 选择合适的JDK - Project language level: 与SDK对应(如JDK 8选8) 5. 配置运行环境: - Web项目 → 配置Tomcat(见第四节) - SpringBoot项目 → 直接运行主类(带@SpringBootApplication注解的类) - 普通Java项目 → 找到main方法,右键Run 6. 验证运行成功: - 浏览器能访问 - 控制台没有报错(或只有不影响的警告)
配完环境后,用下面这个清单自检:
java -version 能显示JDK 8版本号mvn -v 能显示Maven版本号附:常用快捷键速查表(建议打印贴显示器旁)
功能 Windows/Linux Mac 全局搜索 Shift+ShiftShift+Shift查找类 Ctrl+NCmd+O查找文件 Ctrl+Shift+NCmd+Shift+O查找方法 Ctrl+Alt+Shift+NCmd+Alt+O查看定义 Ctrl+BCmd+B查看调用链 Ctrl+Alt+HCmd+Alt+H格式化代码 Ctrl+Alt+LCmd+Alt+L重命名 Shift+F6Shift+F6surround with try-catch Ctrl+Alt+TCmd+Alt+T最近打开的文件 Ctrl+ECmd+E