我先把话说在前面:这篇文章不是教你“用AI自动挖洞”,而是讲一套我已经在实战里跑通的协作模式。核心思路就一句话——把LLM放在研判和决策环节,而不是放在扫描环节。Burp Suite负责它最擅长的事:抓流量、发请求、做主动和被动扫描;LLM负责它最擅长的事:读长文本、归纳上下文、按规则打分、生成有依据的修复建议。
我过去手动研判一份几百条告警的扫描报告,通常要花一整个下午,其中真正需要人动脑子的可能只有十来分钟,剩下的时间全耗在“打开详情页、看响应包、对比历史、复制粘贴”这些重复动作上。现在这套流程跑起来之后,我在同样规模的项目里,初步研判时间压缩到原来的三分之一左右,而且优先级排序的结果比我自己拍脑袋排的更稳。下面我把整个方案拆开讲,从问题拆解、环节设计、评分模型、修复建议,到数据安全和踩坑记录,一次说清楚。
1. 扫描分析到底卡在哪里:先看清人工研判的瓶颈
很多人一听到“用AI辅助Burp Suite”,第一反应是“让它自动跑扫描、自动出报告”。这个方向不是不行,但在我实际用下来,价值远不如“让它帮你做分析和决策”。要理解为什么,得先搞清楚手动研判流程里真正的瓶颈在哪里。
Burp Suite本身已经是行业里公认的Web安全测试利器,它的主动扫描、被动扫描、Intruder、Repeater这些核心功能,经过十几年迭代已经相当成熟。扫描器能做的事情非常明确:发大量请求、比对响应、匹配规则、标记异常。但扫描器天生有两个短板——第一,它不懂业务上下文,一个登录接口和一个公开接口同时报出SQL注入,扫描器给它们的风险等级可能是一样的,但实际业务影响天差地别;第二,它产出的原始报告信息密度极低,一条SQL注入告警可能附带几十行请求响应,但真正需要人判断的信息只有那么几个点。
传统的人工研判流程大概是这样的:扫描完成后,打开告警列表,从高危开始一条条点进去,看请求包、看响应包、看Burp给的漏洞描述,然后判断是真漏洞还是误报,再根据业务经验估算影响范围,最后记下结论。听起来不复杂,但一旦告警数量上了三百条,这个流程就变成了一场耐力测试。尤其是被动扫描模式下,告警里混着大量低危信息泄露、不安全的Cookie属性、缺失安全响应头这类噪音,真正需要重点关注的可能就是那么二十来条。
这里有个很关键的问题:人工研判慢,不是因为分析本身难,而是因为“读取、理解、归纳”这三件事全挤在一个环节里。 读取占了大量时间,理解需要经验积累,归纳则是一个纯粹的消耗性劳动。而这三件事恰好是LLM当前能力最强的区域——上下文理解、信息抽取、结构化输出。所以合理的做法是,把读取和归纳交给LLM,把最终决策权留给人,让人的经验用在最有价值的地方。
这引出一个设计原则:LLM不是要替代安全测试人员的判断力,而是要把安全测试人员从“读报告”的体力劳动里解放出来,让他们把精力放在“做决策”上。这也是我在整个项目里贯穿始终的核心理念。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LLM在扫描链路上的落点设计:不是替代Burp,而是补位研判
理解了瓶颈在哪,接下来就是设计LLM到底插在哪一环。我见过不少人也试过类似的事,但效果不好的原因几乎都一样——把LLM放在了一个不适合它的位子上。比如有人让LLM直接生成扫描请求,这个方向不仅速度慢、成本高,还可能因为模型幻觉产生大量无效请求,完全不如Burp自己的扫描引擎高效。还有人是等扫描报告全部出完人看完了,才把报告丢给LLM总结,这确实能省一点写报告的时间,但对整个流程效率的提升非常有限。
我的做法是把LLM放在扫描报告输出之后、人工逐条研判之前这个环节,让它先做一轮“预研判”。简单说就是:扫描结果先不给人看,给LLM过滤一遍,把原始告警转化为结构化的、按严重程度排序的、带上下文说明的“初步研判清单”,人拿到手的已经不是原始告警,而是一份已经归纳好的待办事列表。
这个环节设计有个前提要求:上下文浓缩要尽量保留可验证的原始信息,不能只给结论不给证据。 毕竟LLM的判断不等于安全结论,人还需要核验。举个例子,一条XSS告警经过LLM预研判之后,输出的不是一句话“疑似存储型XSS,高危”,而应该包含触发参数名、Payload语句、受影响页面路径、响应中的关键回显,以及对应原始告警的编号。这样人核验时直接点开原始条目对照就行,不用再从头理解上下文。
具体实现上,Burp Suite提供了完善的扩展机制,可以通过写自定义扩展来对接LLM API。整个链路的实现逻辑非常直接:
- Burp扩展在扫描器每产生一条告警时,把与该告警相关的请求和响应摘要、告警类型、URL路径、参数名等信息提取出来,组成结构化的文本。
- 扩展将这批告警文本批量发送给LLM,并附带一个设计好的系统提示词,要求模型按规则输出预研判结果。
- LLM返回的JSON结果被扩展解析,重新注入Burp的UI面板或者通过API输出给内部协作平台。
这里有一个工程上的细节值得展开。一个真实项目中,被动扫描的告警量可能是几千条,如果每一条都单独调用LLM,成本和时间都不可接受。所以我的做法是按API路径聚合。也就是说,同一个接口下的同类告警合并为一条待研判记录,参数不同但路径相同、告警类型相同的条目统一处理。聚合之后,一个几千条告警的项目通常能压缩到几百条待研判记录,这个量级调用LLM完全可控。
聚合的思路是有安全逻辑支撑的:同一个接口通常使用同一套后端代码处理,同一个漏洞类型在该接口下出现,大概率是同一个根因,修复方式也一样。逐条研判听起来更精细,实际只是在重复劳动。
在工程实现时还有一个容易被忽视的问题——API返回格式不稳定。LLM的返回偶尔会带上多余的解释文字或者Markdown标记,导致JSON解析失败。我在项目里专门加了一层容错处理:先尝试严格JSON解析,失败后剥离```代码块标记和“这里是结果”这类前缀后缀,再做一次宽松解析。这层容错虽然不起眼,但你在生产环境里用的时候会发现它是刚需,否则一次调用失败就会导致整批告警处理中断。
3. 漏洞优先级排序:从“凭感觉”到“五维评分”
优先级排序是整个方案里我花时间最多、也认为价值最大的部分。过去我在做渗透测试报告时,排序基本靠“扫描器的原始评级加个人经验修正”。扫描器标了Critical的排最上面,High的次之,再结合自己对这个系统的了解手动调整。这种排序方式有两个问题:一是标准不透明,换一个人来看可能顺序就不同;二是容易忽略“中危漏洞高风险影响”的组合场景,比如一个中危的路径穿越加上缺失鉴权,可能比一个孤立的高危SQL注入更需要优先修复。
后来我设计了一个五维评分模型,让LLM按统一标准对每条告警记录打分,最后用加权公式算出综合优先级。这个模型不是凭空想的,是我把过去几百份报告的排序逻辑拆解之后提炼出来的,跑了几轮之后效果稳定,这里直接分享出来。
| 评分维度 | 权重 | 评分说明 |
|---|---|---|
| 可利用性 | 30% | 漏洞被实际利用的难度,越高越容易利用则分数越高 |
| 影响范围 | 25% | 受影响数据或功能的敏感程度,涉及认证数据、核心业务则分越高 |
| 可达性 | 20% | 漏洞入口是否面向公网、是否需认证,面向公网且无需认证的分数越高 |
| 资产重要性 | 15% | 目标系统在业务中的重要程度,核心交易系统得分高于边缘工具系统 |
| 修复成本 | 10% | 修复所需的工作量。注意此处得分高代表“修复成本低”,因为低成本的应该优先处理 |
综合优先级分数的计算方式是:综合得分 = 可利用性×0.3 + 影响范围×0.25 + 可达性×0.2 + 资产重要性×0.15 + 修复成本×0.1。每条告警最后按综合得分从高到低排序,分数越高越需要优先处理。
你会注意到修复成本的权重只占了10%,但它的方向和其它维度相反。这是我特意设计的:在安全领域,完全按风险大小排序会忽略一个现实——有些高风险漏洞修复周期很长,排在最上面的结果是团队成员盯着一个修复周期长达数周的底层框架问题,忽略了另外几个一周内就能修复的中高危问题,总体风险红线的收敛反而更慢。修复成本低但影响可观的漏洞先修完,整体风险下降更快。所以我的建议是修复成本维度不要只看工作量,而是看“快速止血能力”,凡是输入校验缺失、配置错误这类几个小时能解决的问题,都应该提升排序。
让LLM做评分,核心难点不在于“让它打分”,而在于“让它打的分有依据”。如果直接给LLM一条告警让它打一个综合分,得到的分数会很主观,同一件事换个说法可能就变了。所以我的做法是拆成三个阶段。
第一阶段是提取关键信息。让LLM从告警详情里找出和评分相关的客观事实,包括:该接口是否需要认证、是否面向公网、影响的数据类型是否包含敏感信息,以及触发漏洞的参数和请求方式。这些信息都是可以从告警内容里看出来的客观描述,不需要推测。
第二阶段是逐维度打分。不给LLM一个笼统的“打个分”任务,而是让它分别对可利用性、影响范围、可达性、资产重要性、修复成本五个维度打分,每个维度单独给出一个1到10的整数分,并且要求它说明打分依据。这个设计的妙处在于,模型在给单个维度打分时比给综合分时可靠得多,因为它只需要聚焦一个维度的事实。
第三阶段是加权计算和排序。综合得分由程序算,不交给LLM。这样既保证了计算准确性,也方便调整权重——你不用因为改了权重重新跑LLM,只要重新算一遍加权就行。
实际跑下来,这套评分模型的排序结果和我人工排序的重合度在八成以上,但有一个明显优势——稳定性。同一条告警,我上午排和下午排可能因为疲劳程度不同而有所偏差,但LLM在同样的输入下打出的分数基本一致,这让优先级排序的结果可以复现,也更容易说服业务方认可这个顺序。
4. 修复建议的工程化生成:从“泛泛而谈”到“抄作业可用”
排序做完以后,下一步就是修复建议。这一步是最直观能感受到效率提升的环节。过去一个项目下来,我要在报告里为每一个漏洞类型写一条修复建议,写多了之后就发现这些东西高度重复——SQL注入的修复建议十有八九是参数化查询,XSS的修复建议十有八九是输出编码,但不同项目的代码环境、修复等级、受影响组件又不一样,直接复制粘贴套话显然不负责任。
LLM在处理这类内容时有一个很大的优势——它可以根据上下文动态生成不同颗粒度的修复建议,而不是只能输出某一条固定模板。为了让修复建议真正达到“抄作业可用”的水平,我给它设计了六个必需的输出字段,缺一个宁可重跑一次也不接受不完整的输出。
第一个字段是漏洞类型和触发位置,要求模型直接说明“哪个接口的哪个参数存在什么样的漏洞”,这部分信息来自告警本身,确保上下文不丢失。
第二个字段是问题根因分析,要求模型说明“为什么会出现这个漏洞”,需要结合请求参数、后端处理逻辑的常见模式来推断,比如是否直接把用户输入拼进了SQL、是否直接输出了未转义的用户输入。
第三个字段是具体修复方案,这是核心字段。要求模型给出针对代码层的修复动作,比如使用预编译语句替代字符串拼接、在输出位置统一编码、在服务端增加校验白名单等,同时明确规定必须指出修复在哪个层面的哪个环节做,不允许只说“加强输入过滤”这类正确的废话。
第四个字段是代码示例(如适用),要求模型给出关键环节的伪代码或参考代码,但必须注明需要按实际语言和框架适配,不能当作直接可用的最终代码。
第五个字段是验证方法,要求模型描述“修复完成后如何验证漏洞已修复”,比如重新发送同样的Payload看是否还被接受、检查响应头是否已加上安全策略。
第六个字段是预防措施,要求模型从工程层面给出同类问题的长效预防建议,比如在开发规范中加入安全编码评审、在CI/CD流水线接入SAST工具等。
这六个字段设计的目标只有一个——让开发人员拿到修复建议后,不需要再回到告警详情里去翻上下文。所有需要知道的信息已经全部包含在这份建议里了。
这里我想强调一个比较反常识的结论:对修复建议生成来说,比提示词质量更重要的,是给LLM喂的上下文质量。 同样的提示词,只喂一条告警描述时,修复建议往往是套话;但把同一请求的完整请求包、响应包加上相关告警描述合并喂进去,建议的精确度立刻上一个台阶。原因很简单——没有请求包,模型只能靠经验和猜测来推断漏洞成因,有了请求包则能直接看到参数拼接方式,看到反射点在哪个位置,自然能给出更准确的建议。
如果你希望修复建议还能结合你自己的代码仓库,可以再进一步做上下文增强。做法是让LLM先基于告警信息判断漏洞最可能涉及的代码文件类型或关键函数,然后再去匹配仓库里的对应代码片段。具体的落地做法是,把代码仓库的索引提前建好,按函数名、文件名、代码模式做模糊检索,命中后把相关代码片段和告警描述一起拼进提示词。这个方式不需要做完整的RAG,成本低很多,但对修复建议精度的提升非常明显。
不过这里必须说清楚,LLM生成的代码示例绝对不能直接使用。它给出的代码往往是示意性的、简化版的,有时候甚至会出现变量名冲突或者安全性同样薄弱的问题。我把LLM生成修复建议在法律上的定位定义为“给开发人员的高质量参考”,不承担代码审计职责。代码合入之前必须由开发人员在自己环境里经过实际测试,安全验证又由测试人员复测确认,这个人和责任链条不能省。为了做到这点,我在输出格式里给每一条建议加了一个“置信度”字段,模型表达的不是“我用史实保证这是对的”,而是“根据现有信息大概率可行”,这样团队拿到手时就知道哪条可以放心抄,哪条需要多长个心眼。
5. 实测效果:用一个中型项目跑通完整流程
前面讲了这么多设计,好坏还得看实际效果。我拿一个真实的内部测试项目做了三周的完整验证。项目背景是一个有几十个微服务的中型业务系统,Web应用部分包含了管理后台、用户端和几个公开的API网关,项目主要做定期的安全巡检,不是从零开始测试,所以Burp的扫描器运行了两天,累积了相当可观的告警量。
先看最直观的原始告警规模。两天被动扫描加少量主动验证之后,Burp的Dashboard里一共有大约一千七百条告警记录,其中High和Critical级别的有几十条,其余绝大多数是Medium和Low级别的信息类告警。如果按老办法人工逐条研判,这个量级我预计要两天到三天。
按照我设计的流程,Burp扩展首先对这堆告警做路径级聚合。聚合完成后,一千七百条原始告警被压缩到了三百二十一条待研判记录。这个数字的下降幅度非常大,原因是同一个接口下的同类告警实在太多了,比如某个用户信息接口被扫出来几十条Set-Cookie相关告警,聚合后其实只需要处理一条。这个聚合过程纯程序完成,不消耗LLM调用,零成本。
第三步是将这三百多条记录分批送入LLM做预研判和五维评分。每批大概二十条,用异步方式发送。整个处理过程耗时大约四十分钟,平均每条只需要几秒钟。人工只做最终核验,每条核验时间大约在两分钟左右,两百多条真正需要核验的记录,一个下午不到就能全部处理完。相比老办法的整段投入,效率提升直观可见。
来看一个具体的效果对比。有一个登录接口被扫描器标为High级别的SQL注入,扫描器逻辑是检测到参数里带单引号时返回了数据库错误特征。在传统流程里,这条告警会被放到高优先级区域,人打开之后发现它是误报,因为开发者只是把异常信息原样返回了,并没有真正把参数拼进SQL语句,白白排在前面占了半天的注意力。而在新流程里,LLM在预研判阶段做了上下文提取,发现错误信息中带有业务自定义的日志标记,并非标准数据库驱动报错,将这条告警的可利用性评分打了2分(满分10分),排序结果直接降到了中低优先区域。这个环节判断对了,人的核验时间也随之大幅压缩。
还有一条包含了很多信息的调用链。有个文件下载接口同时命中路径穿越和信息泄露告警,扫描器给的都是Medium。传统流程里这类中危往往不会引起重视,排在列表很靠后的位置。但在LLM的评分模型里,因为它检测到该接口不需要认证、传入文件名参数直接拼接了路径、且系统是面向租户的网盘服务,所以可利用性打8分,可达性打了9分,资产重要性打7分,综合得分一下子超越了很多High告警,被排到了优先修复清单的前五名。后来人工复测果然确认这是一个未授权任意文件读取漏洞,影响面不小。这类跨维度风险判断,纯靠扫描器评级或人工泛泛浏览时确实容易漏掉,但评分模型用统一规则把它捞了回来。
模型跑出来的建议质量也颇有意思。有些开发人员拿到建议后发现里面给出的代码示例和仓库里已经存在的另一个模块的写法非常接近,直接改几个变量名就能用,我猜是因为模型在训练语料里见过很多类似代码风格。但也出现过一次挺典型的模型幻觉:一条关于CSRF的修复建议,模型给出的同步令牌模式示例里引用了模板引擎自带CSRF标签,项目实际栈里根本没有这个功能。所以我的经验是修复建议给开发当提示很好,但交付到报告前还是应该人工过滤一遍,不能完全盲信。
这个实测周期里,真正节省时间的不是“扫描”这个环节——Burp的扫描引擎本来就够快,而是判断和归类的过程。原来人工研判阶段占用的时间被压缩了将近七成,团队能腾出精力去做更深入的业务逻辑测试,而不是机械地重复阅读报告。
6. 数据安全、幻觉与信任边界:哪些坑必须提前避开
最后想把整个方案里最容易出问题、也最容易被忽略的几个点单独拎出来说。安全测试这个行业对数据极其敏感,自己如果还在数据安全上翻车,那就太不专业了。
第一个要严格把关的是数据合规。Burp Suite在扫描过程中拦截和产生的流量里,包含请求包中的Cookie、会话标识、请求体里的业务字段、个人信息乃至数据库连接串。这些东西一旦流出到第三方大模型API,就等同于把内网资产和业务数据直接暴露出去。我的处理原则是按数据分级,给出三档策略:纯离线方式适合处理非生产环境和脱敏数据,调用本地部署的开源模型,数据不离开内网;对内部私有化部署的大模型系统,要明确私有化边界后才能考虑接入;任何情况下都禁止把生产环境的真实流量直接发到公网模型API,如果分析确有必要,必须先做脱敏——将Cookie替换为占位符、手机号和身份证号做正则替换、删除请求体中的业务字段内容,只保留结构和类型特征。
我在实际项目里用的是本地部署模型加离线向量库的方案,虽然选型时稍微费了些周折,但换来的是数据完全可控。讲句实在话,安全人员如果连自己的流量防线都守不住,那这个方案本身就没有说服力。
第二个坑是模型幻觉。我在实测阶段至少遇到过三种典型场景。第一是模型在不确定性很高时仍然会煞有介事地给出一个确定的结论,比如把某个正常的业务逻辑说成是逻辑漏洞,这就导致预研判结果里出现少量“假改善”的误报。第二是修复建议里提到了项目里并不存在的框架或函数,这就是纯纯的训练数据拼接幻觉,根本原因它对项目技术栈了解不够。第三是打分时给出的依据和实际内容对不上,通常发生在告警描述资料很贫乏的时候,模型自己脑补了一段上下文。
应对幻觉没有任何魔法方案,就靠两件事:人在关键节点上来复核,以及在提示词里强制要求模型给出依据引用。我用的提示词里专门有一段:如果你不确定,请明确说“不确定”,不要编造。这个约束看起来简单,但确实能大幅减少那种一本正经的胡扯。另外我还在系统设计里加了一层校验——对于修复建议中的代码示例,如果项目仓库索引里检索不到对应的技术栈关键字,自动打上“未验证”标记,提醒人工重点审查。
第三个边界是要清醒认识到LLM不适合做的场景。它不适合生成高精度的检测规则,不适合对未知漏洞类型做独立判断,也不适合在没有足够上下文时作为最终裁决依据。LLM在这套流程里承担的永远是辅助角色:帮助人加快理解速度、减少重复劳动、提供多角度建议。安全测试的最终责任人和判断者,必须是具备经验的人。
这套方案做到最后,我自己体会最深的一点是:LLM真正改变的不是安全工具本身的能力,而是把安全从业者从冗长的重复劳动里解放出来,让他们能在同一个项目周期里覆盖更大的攻击面、验证更多的业务逻辑。扫描器产出告警,AI辅助人做判断,人做最终决策,三者协作,才是我心里比较理想的安全测试形态。
