AI自动化漏洞挖掘实战:从代码审计到渗透测试
最近在做安全测试相关的工作时,明显感觉到一个趋势:漏洞挖掘正在从纯手工向“AI 辅助 + 自动化”转型。传统渗透测试中,很多时间花在翻代码、找参数、试 payload、看日志上,而现在借助大模型和自动化工具,可以把其中一部分重复工作交给脚本和 AI 完成,人工只负责判断方向和验证结果。
这篇文章不打算讲那种“AI 全自动破解一切”的夸张内容,而是从实际可落地的角度,拆解 AI 自动化漏洞挖掘的完整链路:概念、环境、工具、代码审计、自动化检测、常见问题与合规边界。无论你是刚开始接触网络安全,还是已经在做渗透测试但想引入 AI 提效,都可以照着本文的思路搭建自己的学习路线。
1. AI 自动化漏洞挖掘到底是什么
1.1 漏洞挖掘与渗透测试的关系
漏洞挖掘(Vulnerability Discovery)和渗透测试(Penetration Testing)经常被混着说,但两者侧重点不同。
- 漏洞挖掘:更偏向在目标系统、源码、协议中找到潜在的安全缺陷,比如 SQL 注入、XSS、越权访问、敏感信息泄露。
- 渗透测试:更偏向通过模拟攻击路径,验证这些缺陷是否真的能被利用,以及能造成多大影响。
可以这样理解:漏洞挖掘负责“发现问题”,渗透测试负责“证明问题”。实际工作中两者是互相嵌套的,挖到疑似漏洞后,要用渗透的思路去验证;渗透过程中发现某个功能点异常,也可能牵连出新的漏洞。
AI 自动化漏洞挖掘,指的是用大模型、机器学习、规则引擎、自动化脚本等能力,辅助甚至部分替代人工完成信息收集、代码审计、参数测试、漏洞验证等环节。注意“辅助”这个词很关键,当前阶段 AI 还不是全自动挖洞神器,它更大的价值是压缩重复工作的时间。
1.2 AI 在漏洞挖掘中解决了什么痛点
传统漏洞挖掘的痛点非常明显:
- 代码量大:一个中大型应用几百万行代码,人工审计不可能逐行看。
- 信息收集耗时长:子域名、端口、目录、指纹、接口,每一步都可能要跑很久。
- 低水平重复劳动多:同一个接口换着参数测注入、测越权,来回操作非常机械。
- 知识覆盖面宽:Web 漏洞、二进制漏洞、云原生安全、供应链安全,一个人的经验总会有盲区。
AI 在这些场景中的价值比较明确:
- 代码语义理解:大模型可以阅读一段函数,快速指出疑似危险调用。
- 测试用例生成:根据接口参数定义生成边界值、畸形输入、攻击 payload 变体。
- 日志与报错分析:扫描器跑出来的大量报错,AI 可以帮忙归类,过滤掉无效信息。
- 漏洞报告撰写:把验证结果整理成结构化的报告,减少人工整理时间。
在实际实验中,AI 辅助渗透测试和 AI 自动化漏洞挖掘已经很常见了。比如用大模型辅助分析一段 Java 代码里的反序列化入口,或者让模型解释某个 WAF 拦截日志背后的绕过思路,这些都不是天方夜谭。
1.3 AI 安全与漏洞挖掘的关系
AI 安全目前有两个方向需要区分:
- AI for Security:用 AI 技术去做安全分析和攻击模拟,也就是本文讲的核心。
- Security for AI:保护 AI 系统本身的安全,比如提示注入攻击、模型窃取、训练数据投毒、对抗样本攻击等。
这两者在 CTF 比赛和实战中都会出现。比如有的 CTF 赛题会专门设计“AI 安全题目”,让选手通过构造特殊的 Prompt 让模型输出系统提示词,或者利用 RAG 应用中的注入漏洞获取目标文件。如果你准备走网络安全方向,AI 安全题目是一个值得专门练习的细分领域。
2. 环境准备:搭一套漏洞挖掘实验台
要做 AI 辅助漏洞挖掘,不需要一开始就配高配服务器。比较实用的方式是一台普通电脑 + 本地靶场 + Python 环境 + 一个大模型 API 或本地模型即可。
2.1 操作系统与基础软件
推荐使用 Linux 环境做安全测试,原因很实际:大量安全工具原生支持 Linux,命令行环境更干净,权限控制也比 Windows 更接近真实服务器场景。
如果你没有 Linux 基础,建议装 VMware 或 VirtualBox,跑一个 Kali Linux。Kali 自带大量渗透测试工具,比如 Nmap、Burp Suite、Dirb、Sqlmap、Metasploit 等,省去很多安装配置的时间。
常见实验环境如下:
宿主机:Windows 10/11 或 macOS
虚拟机:Kali Linux 2024.x(或其他更新版本)
本地靶场:Pikachu、DVWA、sqli-labs 等
Python:3.10+(本机或 Kali 内均可)
IDE:Visual Studio Code / PyCharm
2.2 本地漏洞靶场是学习的关键
学习漏洞挖掘最怕两件事:一是没有合法目标,二是对真实业务系统造成不可逆影响。本地靶场能同时解决这两个问题。
Pikachu 是一个开源的 PHP 漏洞靶场,内置了 SQL 注入、XSS、CSRF、RCE、越权、文件上传等常见漏洞场景,页面风格接近真实业务,非常适合做自动化漏洞挖掘演练。DVWA 也是经典靶场,它有安全级别设置,可以从 low 到 impossible 逐级挑战,很适合理解漏洞的成因和防御方式。
靶场部署方式一般为 Docker 或 PHP 集成环境,具体部署步骤在不同版本下略有差异。建议自己查一下对应靶场的最新安装文档,不要死记命令。重点是把环境跑起来,能访问到靶场首页。
2.3 Python 环境与依赖
Python 是在自动化漏洞挖掘中最常用的语言,原因是生态丰富、requests/urllib 写脚本快、可以直接调用很多安全库。
学习阶段建议安装以下 Python 包:
pip install requests
pip install beautifulsoup4
pip install urllib3
写自动化脚本时,requests 负责发送 HTTP 请求,BeautifulSoup 负责解析返回的 HTML 页面。更高级的漏洞指纹识别可以配合
whatweb
、
wappalyzer
等工具。
2.4 AI 辅助工具的选择
目前可用的 AI 辅助工具主要分三类。
第一类是通用大模型聊天产品,比如 ChatGPT、Claude、文心一言、通义千问、DeepSeek 等。它们适合做代码审计思路分析、payload 原理讲解、报错信息解读。你不需要把完整源码贴进去,只需要把关键函数或报错片段发过去,让模型帮你分析。
第二类是代码分析平台,比如 GitHub Copilot、Cursor、CodeQL 这类工具。它们可以直接在编辑器里对代码做静态分析,适合审计大型开源项目。
第三类是自己编写 Prompt 工程脚本,把大模型 API 接入到自动化检测流程中。例如一个脚本先跑 SQL 注入检测,发现疑似注入点后,自动调用大模型生成对应的绕过 payload,再把 payload 发回给目标接口验证。这种方式最贴近“AI 自动化漏洞挖掘”的实战场景。
需要说明的是,AI 工具迭代速度快,不同版本的能力差异很大,本文不绑定某一个具体产品。重点是教你建立思路,然后用你手头已有的 AI 工具落地。
3. AI 辅助漏洞挖掘的四种核心思路
3.1 代码审计加速
代码审计是漏洞挖掘的高价值环节。以前人工审计依赖经验和精力,现在可以先让 AI 做第一遍粗筛。
具体做法是把有风险嫌疑的代码文件交给大模型,让它找出以下内容:
- 直接将用户输入拼接到 SQL、命令、模板中的位置。
- 文件上传、文件下载功能中的路径可控点。
-
反序列化入口和危险的
eval、exec调用。 - 越权风险:接口是否校验当前用户身份和资源归属。
- 敏感信息泄露:硬编码密码、Token、OSS 密钥。
一个比较实用的方法是将代码审计 Prompt 模板固定下来,把每个文件都按模板过一遍,AI 输出的可疑点再人工复核。这样能在短时间内覆盖大量代码。
3.2 模糊测试与参数变异
模糊测试(Fuzzing)是自动生成大量异常输入并观察目标行为的技术。AI 在其中的作用是生成更“聪明”的测试数据。
传统 Fuzzing 生成的 payload 往往是随机字符串,命中率有限。大模型可以根据接口参数的含义,生成更合理的边界值、畸形数据、编码绕过变体。比如一个参数期望是数字,模型可以生成负数、极大值、浮点数、字符串、Unicode 数字、SQL 注入变体等,覆盖更全面。
这种测试思路可以用于 Web 接口,也可以用于命令行工具、API、文件解析器。
3.3 流量分析与日志排查
扫描器、爬虫、手工测试都会产生大量流量和日志。漏洞挖掘很多时候就是在这些日志里找“异常”。
AI 在日志分析中的优势在于模式识别。比如你可以把一段 WAF 日志发给大模型,让它解释攻击者试图做什么、payload 是什么编码方式、是否可能绕过当前规则。这样比人工逐个解码快很多。
在自动化链路中,可以让脚本先做常见攻击检测,把命中的请求保存为日志文件,再定时让 AI 汇总日志,输出高优先级问题清单。
3.4 渗透测试中的智能助手
AI 在渗透测试中更像一个“老手在旁边提醒”,而不是全自动攻击系统。
比如你正在测试一个登录接口,不知道从哪里下手。可以让 AI 给一个测试清单:用户名枚举、弱口令、验证码绕过、登录接口是否限速、忘记密码逻辑、JWT Token 校验等。也可以让 AI 根据 HTTP 请求包推断接口的后端逻辑,指出可能存在的业务逻辑漏洞。
这类使用方式对新手特别友好,相当于把一个经验库带在身上,随时查询。
4. 实战案例一:用 AI 辅助审计一段存在注入风险的代码
4.1 准备一段代码
假设我们拿到了一段 Flask 编写的登录接口代码,这是很典型的存在 SQL 注入风险的写法。
# 文件路径:app.py(存在安全问题的示例)
from flask import Flask, request
import sqlite3
app = Flask(__name__)
def get_db():
conn = sqlite3.connect('user.db')
return conn
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
conn = get_db()
cursor = conn.cursor()
sql = "SELECT * FROM users WHERE username = '%s' AND password = '%s'" % (username, password)
cursor.execute(sql)
user = cursor.fetchone()
conn.close()
if user:
return "Login Success"
return "Login Failed"
if __name__ == '__main__':
app.run(debug=True)
这段代码的问题非常明显:字符串拼接 SQL、未使用参数化查询、异常处理缺失。但在一个大型项目中,这类代码往往埋在几万行代码里,人工不一定能快速定位。
4.2 给 AI 设计审计 Prompt
把上面的代码交给大模型,可以设计如下 Prompt:
请对下面这段 Python Flask 代码做安全审计,重点检查:
1. 是否存在命令注入、SQL 注入、路径遍历、文件上传风险。
2. 是否有敏感信息硬编码。
3. 修复建议是什么。
4. 给出一个可利用的测试输入示例。
代码:
【粘贴代码】
模型通常能回答出 SQL 注入风险,并指出
username
和
password
参数未做任何过滤,也没有使用参数化查询。它还会告诉你,可以构造
admin' or '1'='1
来绕过登录验证。
4.3 人工验证 AI 结论
AI 给出的结论只能作为参考,最终要以实际测试结果为准。在本地靶场中,我们可以构造一个真实的测试请求来验证:
curl -X POST http://127.0.0.1:5000/login \
-d "username=admin' or '1'='1' -- &password=anything"
如果目标确实存在 SQL 注入,返回值很可能是
Login Success
。这就证明 AI 审计结论正确,接下来的修复方案也就有了明确方向。
这个案例的意义在于:AI 不是替你写漏洞报告,而是帮你缩小范围、提示风险点,最终验证和决策还是要靠人。
5. 实战案例二:编写 AI 辅助的 SQL 注入检测脚本
5.1 明确测试目标与合法性
在实际项目里做自动化检测,必须确认你有权利对这个目标进行测试。对授权范围内的目标进行验证是安全测试的基本底线。本文的示例只针对本地靶场或你自己搭建的实验环境。
建议统一使用 Pikachu 等靶场环境,把接口跑通后再迁移到更复杂的环境。
5.2 编写基础检测脚本
下面是一个简单的 SQL 注入检测脚本,核心思路是给参数添加单引号、布尔条件、延时 payload,通过响应差异判断是否存在注入点。
# 文件路径:sqli_detect.py
import requests
def check_sqli(url, param, base_data):
results = []
payloads = {
"single_quote": "'",
"boolean_true": "1' or '1'='1",
"boolean_false": "1' and '1'='2",
"time_based": "1' AND SLEEP(3) -- ",
}
for name, payload in payloads.items():
data = base_data.copy()
data[param] = payload
try:
resp = requests.post(url, data=data, timeout=10)
results.append({
"payload": name,
"status_code": resp.status_code,
"length": len(resp.text),
"time_cost": resp.elapsed.total_seconds()
})
except Exception as e:
results.append({
"payload": name,
"error": str(e)
})
return results
if __name__ == "__main__":
target_url = "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php"
test_param = "name"
test_data = {"name": "admin", "submit": "查询"}
result_list = check_sqli(target_url, test_param, test_data)
for item in result_list:
print(item)
这个脚本的输出会展示每个 payload 对应的状态码、响应长度和耗时。当某个 payload 的响应长度和其他明显不同,或者耗时显著增加,就说明可能存在注入点。
5.3 让 AI 解释检测结果
脚本跑完后,你可以把结果粘贴给大模型,例如:
我向某个参数提交了 paylaod,响应长度如下,请分析哪些结果说明存在注入可能:
【粘贴输出结果】
AI 的典型分析逻辑是:
boolean_true
和正常请求的响应长度一致,但
boolean_false
响应长度明显变化,说明布尔注入条件生效,大概率存在 SQL 注入。这种“AI 解读 + 人工复核”的流程比人工看一堆扫描日志高效。
5.4 进阶:接入大模型 API 自动生成测试用例
如果你希望检测脚本更自动,可以设计一个小型工作流:基础探测发现疑似注入点后,调用大模型 API,让模型基于当前参数和响应特征生成更高级的绕过 payload。
伪代码如下:
# 文件路径:ai_sqli_assist.py(伪代码示例,需按实际 API 调整)
import requests
import json
def call_llm(prompt):
# 这里填写你实际使用的大模型 API 配置
# 不同平台的请求格式不一样,需要根据官方文档调整
response = requests.post(
"http://your-llm-api-endpoint",
json={"prompt": prompt},
timeout=30
)
return response.json().get("output", "")
def generate_payloads(feature):
prompt = f"""
根据以下 SQL 注入检测特征,生成 5 个不同的绕过 payload。
要求:覆盖大小写绕过、注释符绕过、URL 编码绕过等思路。
检测特征:{feature}
只输出 payload 列表,不要解释。
"""
result = call_llm(prompt)
payload_lines = [line.strip() for line in result.splitlines() if line.strip()]
return payload_lines
if __name__ == "__main__":
feature = "参数 name 存在布尔注入,or 条件返回正常页面,and 条件返回空页面"
payloads = generate_payloads(feature)
for p in payloads:
print(p)
这是一个非常实用的思路。模型不需要知道目标系统的全部细节,只需根据你提供的注入特征,生成候选测试输入,再交给检测脚本去验证。这样就形成了一个“自动化产生用例 → 自动化验证 → 人工复核”的闭环。
6. 实战案例三:自动化信息收集与敏感路径初筛
6.1 信息收集是漏洞挖掘的起点
渗透测试和 SRC 漏洞挖掘中,信息收集直接决定后续测试的范围和方向。常见的信息收集内容包括子域名、端口、Web 指纹、目录路径、JS 文件中的接口泄露等。
AI 在这里的用途主要有两类:
- 根据目标网站的首页内容和响应头,自动判断网站使用的 CMS、框架、中间件,并映射常见漏洞点。
- 将常见路径字典结合响应特征,筛选出可能存在的后台、备份文件、未授权接口。
6.2 编写路径扫描脚本
下面是一个简单的 Python 路径扫描脚本,利用多线程快速检查常见敏感路径。
# 文件路径:path_scanner.py
import requests
from concurrent.futures import ThreadPoolExecutor
COMMON_PATHS = [
"/admin",
"/login",
"/api",
"/swagger-ui.html",
"/actuator",
"/.git/config",
"/backup.zip",
"/phpinfo.php",
"/robots.txt",
"/.env",
"/api/docs",
]
def check_path(base_url, path):
url = base_url.rstrip("/") + path
try:
resp = requests.get(url, timeout=5, allow_redirects=False)
if resp.status_code == 200:
return {
"url": url,
"status": resp.status_code,
"length": len(resp.text),
"title": extract_title(resp.text)
}
except Exception:
pass
return None
def extract_title(html):
import re
match = re.search(r"<title>(.*?)</title>", html, re.IGNORECASE)
return match.group(1) if match else ""
def scan(base_url, paths):
results = []
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(check_path, base_url, p) for p in paths]
for f in futures:
result = f.result()
if result:
results.append(result)
return results
if __name__ == "__main__":
base_url = "http://127.0.0.1/pikachu"
found = scan(base_url, COMMON_PATHS)
for item in found:
print(item)
运行后,脚本会输出返回 200 的路径,以及每个路径的响应长度和页面标题。接下来你要做的不是盲目访问,而是把结果交给 AI 分析。
6.3 用 AI 生成检测优先级报告
把扫描结果贴给 AI,Prompt 可以写成:
我扫描了一个测试站点的敏感路径,结果如下:
【粘贴扫描结果】
请帮我:
1. 按“最值得优先测试”排序。
2. 每个路径说明潜在风险点。
3. 给出下一步测试建议。
模型会告诉你:
/phpinfo.php
可能泄露配置信息,
/.git/config
可能导致源码泄露,
/actuator
如果存在可能暴露大量运行时信息,建议优先深入测试。AI 会把路径、风险等级和测试思路串起来,等于帮你生成了一份初步的攻击面分析报告。
7. AI 自动化漏洞挖掘的高频问题与排查思路
实践过程中,很多人会卡在一些看似简单的问题上。下面整理几个常见问题和排查方向。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 扫描脚本一直报超时 | 目标站点响应慢、WAF 拦截了检测请求、线程数过高 | 先降低并发数;确认目标是否在授权范围内;给请求增加随机 UA 和延时 |
| AI 分析结果与实际不符 | 模型产生幻觉,或输入给它的代码/日志不完整 | 把关键线索单独提取出来再问;让 AI 给出依据和修复建议,人工复核 |
| 靶场搭建后访问异常 | PHP 版本不兼容、数据库未初始化、端口占用 | 查看靶场官方文档,按对应版本的部署说明操作 |
| 检测到疑似漏洞但无法利用 | 修复了注入点、WAF 拦截、权限不足 | 确认漏洞是否存在的前提条件,检查请求是否完整模拟业务逻辑 |
| 大模型 API 请求总失败 | 网络问题、接口格式不对、密钥失效 | 先确认官方 API 文档的请求格式,用最简单的请求测试连通性 |
| 脚本扫描出的路径很多无意义 | 路径字典太宽泛,没有结合目标指纹 | 先做指纹识别,再针对不同 CMS 选择对应字典 |
AI 工具本身也会形成新的攻击面,比如有人在 CTF 赛题中专门设计“提示注入”和“模型窃取”类题目,这提醒我们:用 AI 做漏洞挖掘的同时,也要了解 AI 系统自身的安全风险,比如对话历史是否包含敏感信息、上传的代码片段是否有保密要求、大模型 API 的 Token 是否有泄露风险。
8. 最佳实践与工程建议
8.1 授权边界是第一条红线
在任何形式的漏洞挖掘、渗透测试、漏洞验证开始之前,先确认授权书面文件或明确授权记录。这个底线对任何人都适用,无论技术多高、工具多强,都不能越过合法边界。学习阶段尽量使用本地靶场、CTF 题目平台和有授权的 SRC 项目。
8.2 数据脱敏与隐私保护
在 AI 辅助漏洞挖掘中,你经常会把代码片段、日志、请求包内容发送给大模型。要注意:
- 不要把真实业务系统的敏感数据直接粘贴给外部模型。
- 日志中的密码、Token、身份证号、手机号要先脱敏。
- 如果企业内部有合规要求,优先使用私有化部署的模型或经过审批的 AI 平台。
- AI 对话记录可能被留存,生产环境的数据要谨慎处理。
8.3 把 AI 当“副驾驶”而不是“自动驾驶”
AI 生成的 payload、审计结论、测试用例,天然存在误报和漏报,不能直接当成攻击结果。
正确的处理方式:
- AI 输出的结果要做复现验证。
- 修复建议要结合业务场景判断。
- 测试脚本要在测试环境跑通后再考虑是否迁移。
- 漏洞报告需要人工补充影响范围和利用条件。
8.4 建立自己的自动化工作流
从学习阶段开始,就可以积累一套标准的自动化工作流。推荐的分层结构:
第一层:信息收集
域名 / IP / 指纹 / 端口 / 目录 / JS 文件
第二层:漏洞探测
常见漏洞检测脚本 + 大模型生成测试用例
第三层:验证与利用
人工确认 + 漏洞复现 + 影响评估
第四层:报告输出
AI 辅助生成报告 + 人工审核
每层之间可以通过脚本传递数据。比如第一层扫描到某个 CMS 版本,第二层自动加载这个 CMS 的已知漏洞测试用例,第三层验证成功后,第四层自动生成一条漏洞记录。这样的体系可以帮助你在 SRC 漏洞挖掘中极大提升效率。
9. 学习路线与下一步
如果你是完全零基础,我建议按以下顺序推进:
- 第一阶段:掌握 Web 基础,理解 HTTP 协议、前后端交互、Cookie 和 Session 机制。
- 第二阶段:学习常见漏洞的原理,在 Pikachu、DVWA 等靶场中手动复现 SQL 注入、XSS、CSRF、文件上传等漏洞。
- 第三阶段:学习 Python 脚本编写,用 requests 库写自动化检测脚本,把第二阶段的手工操作脚本化。
- 第四阶段:学习使用 Burp Suite 抓包改包,理解请求和响应的完整链路。
- 第五阶段:引入 AI 辅助,用大模型做代码审计、日志分析、payload 生成,尝试构建自己的自动化工作流。
- 第六阶段:参与 CTF 个人赛,尤其是包含 AI 安全题目的比赛,检验前置学习成果,扩展对新型攻击面的认知。
CTF 是一个很好的练兵场,它不需要授权,题目本身就是一个合法的测试目标。通过模拟 CTF 个人赛,你可以练习 Web 漏洞利用、命令执行、代码审计等能力,也能接触一些现实中不常见的攻击技巧。
整个 AI 自动化漏洞挖掘方向的核心,不是学会某一个工具,而是建立一套“思路 + 脚本 + AI + 验证”的方法论。工具会过时,模型会迭代,但方法论可以不断复用。希望这篇文章能帮你找到切入点,尽快搭建起自己的学习环境和自动化检测体系。
更多推荐
所有评论(0)