一句话:"帮我找漏洞"是废话,"按这个数据流追踪规则分析这段 Java,输出 JSON"才是指令。
一、为什么大多数人的 AI 挖洞尝试都失败了
90% 的人这么用 AI:
帮我看看这个网站有没有漏洞
得到的必然是教科书式的废话。问题不在模型笨,在于你没给它约束。
漏洞挖掘是一个有明确目标、明确输入、明确输出格式的任务。提示词的质量直接决定输出的可用性。
二、四个必备要素
一个合格的漏洞挖掘 Prompt,必须包含:
1. 角色 + 领域约束
你是一名有 10 年经验的 Java 代码审计工程师,专精 Spring 生态的
反序列化、SpEL 注入、SSRF 与鉴权绕过。
不要写"你是安全专家"这种泛角色——领域越窄,输出越准。
2. 明确的输入边界
以下是完整的 Controller 层代码(共 3 个文件)。不要假设存在
未提供的类实现,如果关键逻辑缺失,明确告诉我缺什么。
这一句能砍掉一半幻觉。
3. 可执行的分析规则
按以下顺序分析:
1. 找出所有接收外部输入的入口(@RequestParam/@RequestBody/@PathVariable)
2. 对每个入口,追踪数据是否流入危险函数(Runtime.exec/ProcessBuilder/
ObjectInputStream/JdbcTemplate 拼接/SpEL 解析)
3. 如果存在流入路径,检查中间是否有过滤、白名单、类型转换
4. 只有"无过滤且可达"才判定为漏洞
把方法论写进提示词,而不是指望模型自己想。
4. 结构化输出
以 JSON 数组输出,每项包含:
{ "vuln_type": "", "severity": "high|medium|low", "file": "",
"line": 0, "source": "", "sink": "", "taint_path": [],
"poc_input": "", "confidence": 0.0-1.0 }
结构化输出让你可以批量后处理,把结果直接喂给下一个环节。
三、实战 Prompt 模板(代码审计版)
# 任务
对提供的代码进行安全审计,识别真实可利用的漏洞。
# 角色
资深代码审计工程师,关注 OWASP Top 10 与业务逻辑缺陷。
# 硬性规则
- 只报告有明确 source → sink 数据流的漏洞
- 不要报告"理论上可能"的问题,除非你能给出具体触发路径
- 无法确定时,confidence 填低于 0.5
- 不要编造未提供文件中的代码
# 分析流程
1. 列出所有外部输入入口
2. 对每个入口做污点追踪
3. 检查净化函数(escape/sanitize/validate)
4. 判断可达性(是否有鉴权、是否被其他分支拦截)
# 输出格式
[JSON 数组,字段见上]
# 代码
```java
{{CODE}}
## 四、降低幻觉的三个技巧
### 技巧一:强制"我不知道"
如果你需要的信息不在提供的材料里,必须回答"信息不足",禁止推测。
### 技巧二:Few-shot 锚定
给 2~3 个"正确判定"和"错误判定"的例子,模型会显著收敛到你的标准。
示例1(应报告):
source: @RequestParam("cmd")
sink: Runtime.exec(cmd)
→ 判定:命令注入,confidence 0.9
示例2(不应报告):
source: @RequestParam("id")
sink: jdbcTemplate.queryForObject("select * from t where id=?", ...)
→ 判定:非漏洞(预编译占位符),confidence 0.0
### 技巧三:让模型自我批判
两轮对话:
第一轮:分析并输出候选漏洞
第二轮:你现在是审查者,逐条质疑上面的结论,指出哪些是误报,
哪些证据不足。最后只保留经受住质疑的条目。
这一招能把误报率打下来一大截。
## 五、分治策略:别指望一次问完
处理 10 万行代码时,不要一次性塞进去。正确做法:
第一轮:先让 AI 输出项目结构理解 + 危险入口清单(喂目录树 + 关键文件)
第二轮:针对每个入口,单独喂相关文件,做深度污点追踪
第三轮:汇总所有局部结论,让 AI 判断能否串联成完整利用链
这就是**"AI 化的分治审计"**——把大问题拆成模型能一次处理的小问题。
## 六、反面案例对照
| 差的 Prompt | 好的 Prompt |
| --- | --- |
| 帮我找漏洞 | 按污点分析规则审计以下 Java 代码 |
| 这个 Payload 能绕过吗 | 目标 WAF 拦截了 `<script>`,请给出 5 种等价编码变形 |
| 写个 exploit | 已知 CVE-XXXX 是 XX 类型的栈溢出,目标版本 X.Y,请给出验证 PoC |
| 有没有 SQL 注入 | 分析这个参数是否流入 SQL 拼接,给出布尔盲注 Payload |
## 七、小结
提示词工程不是"玄学话术",而是**把资深工程师的思维过程显式编码**。你越清楚自己是怎么判断漏洞的,就越能写出让 AI 复现这个判断的 Prompt。
下一篇:用 AI 做企业资产测绘与子域名收集。
---
*系列文章:AI 渗透测试与漏洞挖掘实战*