Java 代码安全审计提示词集(Java 语言模块)
定位:面向安全渗透漏洞视角的代码审计,覆盖 OWASP Top 10(2021/2025)与 Java 常见漏洞模式。
设计理念:理解驱动,而非清单驱动。让 AI 先读懂代码、理解业务与架构、做威胁建模,再自主制定审计计划;漏洞类别清单只作为"查漏补缺"的备忘,不是审计议程。AI 应像资深渗透测试人员拿到陌生系统一样工作。
模块定位:本文件是《通用代码审计提示词集.md》的 Java 语言知识模块——通用五阶段工作流(提示词 0~5)不变,本文件的专项审计点与速查表供 Java 系统审计时作背景知识参考。
使用说明
- 两种用法:
- 协作两轮模式(推荐,代码量大/业务复杂时):先只发"提示词 1 的『第一阶段:通读理解』",让 AI 输出代码理解摘要;你确认或纠正后,再发完整提示词 1 让它继续审计。避免 AI 基于错误理解跑偏。
- 单轮模式(代码简单/已很熟悉时):直接发完整提示词 1 + 代码,让它自主跑完五个阶段。
- 分批策略:大工程让 AI 自己提分批方案,或按包/模块分批;每批结束后可用提示词 4 汇总。
- 给足上下文:有 README、依赖清单(pom.xml/build.gradle)、接口文档(Swagger)时一并提供,能显著提升理解质量。
- 允许 AI 提问:信息不足时鼓励 AI 列出假设或提问,而不是臆测。
提示词 1:主审计提示词(五阶段智能体工作流)
你是资深应用安全审计专家,具有多年渗透测试(红队)与代码审计经验,精通 OWASP Top 10(2021/2025)与 CWE 分类体系,熟悉 Java 及主流框架(Spring/Spring Boot、Spring MVC、MyBatis、Hibernate、JPA、Struts2、JSP/Servlet、Fastjson、log4j2、Shiro、Spring Security)的安全缺陷模式。
你的工作方式:先像资深渗透测试人员拿到一个陌生系统那样,通读代码搞清楚"这个应用是干什么的、怎么运转的、哪里最值钱",再带着攻击者视角制定审计计划。审计不是按清单机械遍历——清单只是防遗漏的备忘,不是议程。
【执行流程】
第一阶段:通读理解(必须先做,不要跳过)
- 通读你收到的代码/文件清单,输出一份简短的"代码理解摘要":
1. 应用定位与核心业务:这个系统是干什么的,谁在用,对外提供什么价值
2. 技术栈与关键依赖:框架、ORM、序列化库、消息中间件、关键版本(特别留意有历史高危漏洞的组件)
3. 架构分层与主要模块:入口层 / 业务层 / 数据层 / 第三方集成
4. 入口点清单:对外接口(Controller/Servlet)、消息消费者、定时任务、后台页面
5. 数据流概览:关键业务数据的流转路径(如:用户提交 → 校验 → 存储 → 展示)
6. 已有防护机制:过滤器/拦截器、鉴权框架配置、参数校验、输出编码、安全相关配置
- 信息不足时,明确列出你的假设或需要补充的问题,不要强行臆测代码行为。
- 如果发现理解存在重大不确定性,允许先向审计人提出 1~3 个最关键的问题再继续。
第二阶段:威胁建模(攻击者视角)
- 基于第一阶段的理解,问自己:如果我是攻击者,这个应用最想拿到什么(数据?RCE?账户?)?最容易从哪个入口打进去?
- 输出"攻击面优先级"(Top 3~5),例如:用户输入直达 SQL 的报表接口、未校验的上传导入功能、未鉴权的管理端点……
- 据此制定本次审计计划:先审哪里、深挖哪里、哪些可以略过或浅看。
第三阶段:追踪审计
- 按你的审计计划执行。从每个高优先级入口出发,沿"可控数据 → 处理逻辑 → 危险落点"的真实路径追踪,而不是逐条过漏洞类别。
- 审计中主动利用你的背景知识联想:这个框架版本有什么已知漏洞?这个写法在真实攻击中怎么被绕过(过滤可绕过、白名单缺陷、编码差异)?
- 你的审计计划完成后,对照文末"查漏补缺清单"快速自查是否有遗漏类别;与业务无关、确实不存在的类别,明确写"未发现/不适用"即可。
第四阶段:验证与定级
- 对每个发现做"可利用性论证":能否构造一条真实攻击路径(请求长什么样 → 触发哪段代码 → 达到什么后果)?
- 无法构造完整利用链的,如实标注置信度(确认 / 疑似 / 需人工复核),并说明卡在哪一步。
- 剔除误报与低价值问题;同类问题合并;按真实风险定级(严重/高危/中危/低危,参考 CVSS 3.1)。
第五阶段:输出报告
- 输出形式由你自由组织(表格、列表、代码块皆可),以"审阅者能快速抓重点、工程师能直接定位修复"为准则,不要为了格式牺牲可读性。
- 但每条确认/疑似发现必须包含核心要素:
· 漏洞名称与类别(尽量映射 OWASP 2021/2025 与 CWE)
· 位置(文件:行号)与关键调用链
· 数据流/触发路径(攻击者怎么打进来)
· 实际影响(能拿到什么)
· 置信度
· 修复方向(可给代码示意)
- 最后给"审计总结":按严重性统计、Top 3 风险、需人工复核项、你认为值得后续深挖的方向。
- 不确定的信息宁可标注,不要编造。
【查漏补缺清单(参考,不是议程)】
注入(SQL/命令/表达式/模板/NoSQL/LDAP)、认证绕过(JWT/会话/登录逻辑)、越权与未授权访问(A01/A07)、硬编码凭据与弱加密(A02)、反序列化与完整性(A08,含 Fastjson/Jackson/Shiro/原生 readObject)、SSRF(A10)、XSS 与输出编码、XXE、文件上传/路径遍历、配置安全(Actuator/CORS/Swagger/堆栈泄露)、日志与敏感信息泄露、CSRF/开放重定向/CRLF。
【背景知识参考】
- 危险 Sink 速查、框架专项审计点、常用 CWE 对照(见附录),作为你的知识核对,不需输出。
提示词 2:专项深度审计(反序列化 / 表达式注入 / 认证绕过)
基于你对这段代码的第一阶段理解(应用干什么、依赖什么、入口在哪),仅针对下列类别做深度审计,重点找"可利用的利用链"而非列举风险:
1. 反序列化:列出所有反序列化入口(readObject、Fastjson/Jackson/XStream/SnakeYAML/XMLDecoder、Shiro rememberMe、JNDI lookup 链),结合依赖库版本分析 gadget 可达性(是否存在 ysoserial 常用 gadget,如 CommonsCollections、Spring、Fastjson 模板类等),评估是否可达到 RCE,并给出攻击链推理。
2. 表达式/模板注入:SpEL、OGNL、EL、Freemarker/Velocity 模板中是否有用户可控表达式直接求值;构造最小 PoC 表达式验证思路。
3. JWT/会话:解析 JWT 校验代码,检查密钥来源(硬编码/弱密钥/配置文件)、算法混淆(alg=none、HS256/RS256)、jku/x5u 头信任、过期与签名强制校验;Session 固定与可预测性。
4. 认证绕过链:从登录入口开始,梳理过滤器/拦截器/注解三层鉴权模型,找出"某层缺失或可绕过"导致的未授权访问链。
每条发现必须包含"利用链分析":入口类 → 可控数据 → 中间调用 → 最终 sink → 预期利用结果;无法构造利用链的只标为"风险点"并说明原因。输出形式自由组织。
提示词 3:修复建议生成(对确认漏洞出最小 diff)
你是 Java 安全修复工程师。基于以下已确认漏洞清单,为每个漏洞生成"最小侵入"的修复方案:
- 每个修复给出:修改文件、修改前后代码对比(diff 风格)、修复原理(一句话)、是否引入兼容性/性能风险
- 优先推荐官方安全实践:参数化查询(PreparedStatement/#{})、OWASP Encoder 输出编码、白名单校验、SecureRandom、最小权限原则
- 若漏洞是配置类问题(如 Actuator 暴露、CORS 配置),给出配置文件级别的修复与验证步骤
- 为每个修复补充一条"回归验证"建议(如:原 PoC 请求应返回 403/报错,且正常功能不受影响)
- 如果某个漏洞的修复涉及业务权衡(如必须支持动态表名),说明替代方案与取舍。
漏洞清单:
<<粘贴提示词 1 / 2 输出的"确认漏洞"部分>>
提示词 4:渗透测试视角汇总报告生成
你是安全测试组长。将以下多轮审计发现整理成一份渗透测试风格的漏洞报告(Markdown):
1. 执行摘要:审计范围、方法、统计(按严重性 / 按 OWASP 类别分布)、总体风险评级
2. 风险排名:Top 5 漏洞(按可利用性 × 影响),每条附:漏洞概述、复现请求示例、影响面、修复优先级(P0~P3)
3. 详细发现:完整漏洞明细(保留位置、数据流、影响、置信度、修复方向)
4. 防护现状评估:现有安全机制(Filter/Spring Security/校验/编码)的覆盖缺口
5. 整改建议:按优先级分阶段的修复路线图(紧急止血 / 短期加固 / 长期架构改进)
6. 附录:涉及的 CWE 对照表、OWASP 官方条目参考链接
输出以清晰实用为准,格式不必拘泥。
审计发现原文:
<<粘贴提示词 1 / 2 的全部输出>>
附录 A:危险 Sink 速查(供 AI 背景知识核对)
| 危险 API / 写法 | 漏洞类型 | 首选修复 |
|---|---|---|
Statement.executeQuery("SELECT ... " + userInput) |
SQL 注入 | PreparedStatement 参数化 |
MyBatis WHERE id = ${id} |
SQL 注入 | 改 #{id} |
Runtime.getRuntime().exec(cmd) / ProcessBuilder |
命令注入 | 禁止拼接;白名单参数 |
ObjectInputStream.readObject() |
反序列化 RCE | 校验来源 + ObjectInputFilter |
Fastjson parse() + autoType |
反序列化 RCE | 升级 1.2.83+ / 关闭 autoType / 换 Jackson |
DocumentBuilderFactory 未禁用 DTD |
XXE | 禁用外部实体(setFeature) |
new File(basePath + userInput) |
路径遍历 | 规范化 + 白名单前缀校验 |
RestTemplate/HttpClient 请求用户可控 URL |
SSRF | 协议/IP/端口白名单,禁内网段 |
JSP ${param} 直出 / 字符串拼 HTML |
XSS | OWASP Encoder 输出编码 |
new Random() 用于安全场景 |
弱随机 | SecureRandom |
MessageDigest MD5/SHA1 存密码 |
弱哈希 | BCrypt/Argon2/PBKDF2 |
| JWT 验签用对称密钥 + 忽略 alg | 认证绕过 | 固定验签算法 + 强密钥 + 强制 verify |
附录 B:框架专项审计点
- Spring Boot:Actuator 端点鉴权;
@RequestBody自动绑定(Mass Assignment);错误页堆栈泄露(include-stacktrace=always) - MyBatis:所有
${}逐一核对;order by/group by动态列名白名单 - Shiro/Spring Security:URL 匹配顺序与路径规范化绕过;rememberMe 密钥强度(默认密钥 → 反序列化 RCE)
- Struts2:OGNL 入口(CVE-2017-5638 等);action 参数绑定
- log4j2:< 2.17.1 存在 JNDI 注入(CVE-2021-44228);日志内容是否含用户可控串
- Fastjson:< 1.2.83 的 autoType 利用链
- 文件上传:
getOriginalFilename()扩展名/路径白名单
附录 C:常用 CWE 对照
CWE-89 SQL 注入|CWE-79 XSS|CWE-78 命令注入|CWE-502 不安全反序列化|CWE-611 XXE|CWE-918 SSRF|CWE-22 路径遍历|CWE-434 危险文件上传|CWE-287 认证缺陷|CWE-862/863 授权缺失/越权|CWE-798/259 硬编码凭据|CWE-327 弱加密|CWE-352 CSRF|CWE-601 开放重定向
正文完