尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OWASP ZAP 从安装到实战:Web 漏洞扫描与自动化集成指南

OWASP ZAP 从安装到实战:Web 漏洞扫描与自动化集成指南 1. 为什么我最终把 ZAP 留在了工具箱里第一次接触漏洞扫描这个方向的时候我手里其实有好几款工具商业的、开源的都试过一轮。折腾了大半年之后OWASP ZAP 成了我每台工作机上必装的常驻软件。原因说出来很朴素它免费、开源、跨平台而且从纯手工的代理抓包到全自动的主动扫描都能在一个界面里完成不需要在五六个工具之间来回倒腾数据。对于刚入门 Web 安全测试的人或者团队里需要一个能快速对自家系统做一轮体检的开发者来说这个特性其实比很多花哨的功能更值钱。这篇文章我打算把 OWASP ZAP 从下载、安装到真正能用起来打一轮扫描的完整路径讲清楚。我会按我自己的实际操作顺序来写包括各个系统的安装方式、代理和证书怎么配、被动扫描和主动扫描分别怎么开、认证站点和带文件上传接口的站点怎么处理、报告怎么出、以及我在实际使用中踩过的那些坑。不管你之前有没有用过类似工具跟着走一遍基本能独立跑通一套完整的扫描流程。需要先把一件事说在前面这类工具只能用于你自己拥有产权、或者已经拿到明确书面授权的目标。未经授权对第三方系统发起扫描性质上和入侵没区别这一点没有任何模糊空间。我们做的所有测试都建立在授权范围内。1.1 从手工点测到自动化扫描的转折早些年我做测试基本靠手工浏览器开个代理一个个接口点过去看返回、看参数、看错误信息。这种方式对业务逻辑的把握最准但覆盖面受限于人的精力一天能认真过完的接口数量有限。真正让我改变工作方式的是一次给内部系统做安全评估几百个接口靠手工根本跑不完我才认真去研究自动化扫描工具的用法。自动化扫描的价值不在于替代人工而在于把那些重复度高、规则明确的检查项批量跑掉。比如响应头里缺失的安全策略、Cookie 没打 HttpOnly、反射型输入未过滤、目录列表暴露这类问题工具几秒钟就能扫完一个站点人去做这些纯属浪费。而 ZAP 的被动扫描机制有个我很喜欢的设计它在代理流量经过的时候顺带做检查不对目标发起额外的攻击性请求所以哪怕在相对敏感的环境里做初步摸底风险也可控。等摸底有结果了再针对性地开主动扫描。1.2 ZAP 和同类工具的定位差异市面上做 Web 漏洞扫描的工具不少各有各的脾气。有些工具偏向于大规模资产测绘一次性喂几千个域名做批量探测有些偏向于深度利用能直接打出利用链。ZAP 的定位更偏向交互式测试助手它既能当一个抓包代理用也能在你在浏览器里正常操作业务的同时后台持续分析流量并给出告警。这个差异带来的实际影响是ZAP 更适合在测试某个具体业务系统的过程中使用边测边看告警而不是丢一个域名列表进去等结果。它提供的四种模式——安全模式、保护模式、标准模式、攻击模式——也体现了这种思路。安全模式完全不发任何可能造成影响的请求攻击模式则放开所有主动扫描能力。你可以根据测试阶段的推进逐步把权限放开。这种渐进式的工作方式我认为比一键扫描更符合真实项目的节奏。1.3 谁适合从这篇内容入手如果你是开发人员想在上线前给自己的接口做一轮基础体检这篇内容能帮你把环境搭起来并跑通第一轮扫描。如果你是刚转做安全测试的新人ZAP 是理解漏洞扫描到底在扫什么的绝佳入口因为它的告警里会附带请求、响应、参考链接你能顺着看到问题到底出在哪一行流量上。如果你已经在用 Burp 之类的工具ZAP 的自动化能力和命令行接口可以作为补充特别是在需要把扫描塞进流水线的场景里。基础不同重点不一样但路径是同一套。2. 下载与安装各系统的落地方案安装这一步看着简单实际上不同系统、不同方式装出来的 ZAP功能可用性和后续维护成本差别不小。我按平台分开讲你对照自己的环境挑一种走就行。2.1 先确定版本和运行环境ZAP 是 Java 写的所以运行依赖 JDK。官方提供的安装包里Windows 版本一般自带了运行时macOS 和 Linux 的安装包也大多内置了 JRE正常安装不需要你单独配 Java 环境。但如果你是下载的纯压缩包版本或者想用命令行无界面模式那就得确保系统里有可用的 Java 运行时。我的习惯是统一装一个较新版本的 JDK然后在启动脚本里显式指定避免系统里多个 Java 版本互相干扰导致启动失败。版本选择上官方发布分为稳定版和每日构建版。日常使用闭眼选稳定版功能经过一轮轮验证出问题的概率低。每日构建版主要是给需要尝鲜新检测规则的人用的稳定性不敢保证。下载的时候留意页面上的版本号和发布日期别拿到一个放了两年的旧包。提示无论哪个平台下载完成后建议核对一下官方给出的校验值确认文件在传输过程中没被篡改。这一步很多人会跳过但作为安全从业者自己用的工具来源是否可信恰恰是最该较真的地方。2.2 Windows 下的安装步骤Windows 是我周边同事用得最多的环境安装流程也最省心。从官方页面拿到.exe安装包后双击运行安装向导会依次问安装路径、是否创建桌面快捷方式、是否关联相关文件类型。路径里我建议不要带中文和空格虽然现在的版本对中文路径容忍度提高了但早些年出现过插件加载路径含中文时解析异常的情况避开了省心。安装完成后第一次启动会弹出一个窗口问你以哪种模式运行以及是否要持久化会话。持久化会话的意思是本次抓到的所有流量和扫描结果会被保存成一个 session 文件下次打开还能接着看。如果你在做持续几天的项目建议开启如果只是临时试一下不持久化更清爽退出就不留痕。这里的选择后面可以在界面里改不用太纠结。安装过程中如果遇到防火墙弹窗询问是否允许程序通信记得放行否则 ZAP 的本地代理端口可能被拦住浏览器连不上来。另外Windows Defender 有时会对安装包里的某些组件报可疑这是安全软件对抓包类工具的常见误报确认来源可信后按提示处理即可。2.3 Linux 与 macOS 的安装方式Linux 下最常见的是两种路子。一种是下载官方提供的.tar.gz包解压后直接运行目录里的启动脚本好处是不污染系统包管理卸载就是删目录干净利落。另一种是通过发行版仓库或者第三方仓库安装好处是能跟着系统更新坏处是版本往往落后官方好几个小版本有些新检测规则用不上。我一般用解压包的方式在/opt下放一个目录然后建一个软链接指向可执行脚本这样版本升级时只需要换链接。macOS 用户比较省事官方提供.dmg镜像挂载后把应用拖进应用程序目录就行。需要注意的是如果系统提示无法验证开发者需要在安全性与隐私设置里手动允许一次。另外 macOS 上通过 Homebrew 也能装命令一行搞定适合习惯用包管理器的用户。命令行版本在这两个系统上都很常用尤其是要集成到自动化任务里的时候后面讲命令行的时候会细说。2.4 用容器跑一套临时环境如果你的机器上不想长期装这个软件或者需要在一台服务器上临时起一套扫描环境容器是个很省事的方案。拉取官方镜像后把界面端口和代理端口映射到宿主机就能通过浏览器访问 Web 界面来操作也能直接连容器暴露出来的代理端口。# 拉取官方镜像 docker pull zaproxy/zap-stable # 以交互方式启动映射界面和代理端口 docker run -u zap -p 8080:8080 -p 8090:8090 -i zaproxy/zap-stable zap-webswing.sh这里 8080 通常对应界面访问端口8090 对应代理端口具体以镜像文档为准。容器方式的好处是环境隔离彻底扫描完把容器删掉宿主机上不留任何东西。坏处是网络配置稍微绕一点尤其是你想让它扫描宿主机上跑的本地服务时需要处理容器网络地址的问题。我一般会把待测服务也放进同一个自定义网络里通过服务名互访能避开不少地址困惑。3. 第一次打开界面的正确姿势装好之后别急着点扫描按钮先把界面和几个核心概念理一遍能省掉后面大量返工。ZAP 的界面元素不算少但真正天天打交道的就是那几块。3.1 四种模式的区别与切换时机前面提到过模式的概念这里展开说。安全模式下ZAP 不会发起任何可能对目标造成影响的请求连主动扫描都会被禁用适合在生产环境或者不允许有任何扰动的情况下做纯被动观察。保护模式类似但它会允许你手动发起一些请求只是自动化的攻击行为被限制。标准模式是默认档被动扫描全开主动扫描需要你手动触发。攻击模式则把限制全放开包括那些可能触发告警、写入数据、造成服务压力的检测项。我自己的用法是前期摸底用标准模式确认目标环境是测试环境、且授权范围明确之后再切到攻击模式做深度扫描。切换的位置在工具栏上点一下就能改但改之前一定要想清楚当前目标是不是能承受攻击性请求。很多线上系统对异常请求很敏感一个不小心的主动扫描就可能把服务打挂这个责任得自己扛。3.2 核心面板的功能拆解界面左侧是站点树随着你浏览目标所有被访问过的目录和接口会以树状结构列出来这是你后面选择扫描范围的主要依据。中间上方一般是请求和响应面板选中某个节点就能看到具体的流量内容。中间下方是历史记录记录了所有经过代理的请求支持按方法、状态码、URL 关键词过滤找特定接口的时候非常方便。右侧那块是告警面板被动扫描发现的问题会实时往这里堆。每条告警点开能看到风险等级、置信度、涉及的参数、请求响应证据以及一段说明和参考链接。我强烈建议新手把每条告警的说明都读一遍这是理解漏洞成因的最快途径。底部是各种输出窗口扫描进度、脚本日志、报错信息都在这儿。注意历史记录里的信息量会随着浏览迅速膨胀项目做久了 session 文件可能几个 G。定期清理或者分段保存别让一个文件拖垮整个工具的响应速度。4. 被动扫描不动目标的第一层网被动扫描是我最推荐新手先玩明白的功能。它不向目标发额外请求只是分析流经代理的流量所以几乎没有副作用。4.1 代理配置与流量接管要让 ZAP 看到流量得让浏览器把请求发给它。ZAP 启动后会默认监听一个本地端口标准模式下通常是 8080具体以界面显示为准。然后在浏览器的代理设置里把 HTTP 和 HTTPS 代理都指向127.0.0.1加这个端口。更省事的做法是用浏览器插件来切换代理比如给 Chrome 装一个代理管理插件配置一个指向 ZAP 的代理配置需要抓包时一键开启平时关掉互不影响。我习惯专门开一个干净的浏览器配置文件来做测试不装日常插件、不登录个人账号避免测试流量和私人流量混在一起也避免会话信息互相污染。配置好之后在浏览器里访问目标站点回到 ZAP 看历史记录应该能看到请求一条条冒出来。如果一条都没有先检查代理端口对不对、浏览器插件有没有生效、以及 ZAP 那边有没有弹出证书相关的拦截提示。4.2 证书导入绕不过去的一步HTTPS 流量要被抓到必须让浏览器信任 ZAP 生成的根证书。这一步不做访问 HTTPS 网站时浏览器会直接报证书错误流量也就抓不全。ZAP 提供了证书导出功能在选项里找到证书相关设置把根证书导出来保存成文件。导入的方式各浏览器不同。以 Chrome 为例可以在设置里找到证书管理把导出的证书导入到受信任的根证书颁发机构下面。Firefox 有自己的证书库需要在隐私与安全设置里单独导入。导入完成后重启浏览器再访问 HTTPS 站点看看 ZAP 的历史记录里能不能看到明文内容。能看到说明证书链打通了。这套证书是本地生成的只在你自己的机器上有效用完记得在不需要抓包的时候把代理关掉、把证书清理掉。有些同事图省事一直挂着代理结果日常上网全部经过本地工具体验和安全性都不好。4.3 看懂被动扫描的告警被动扫描的规则覆盖了很多常见的低风险问题比如响应头缺少某些安全策略、Cookie 属性设置不当、页面里泄露了敏感的注释信息、错误页面暴露了技术栈版本等。这些单项看着不起眼组合起来往往是攻击者做信息收集的起点。告警面板里每条记录都有风险等级从信息、低、中到高。我的建议是不要只盯着高危看那些信息级别的告警经常能帮你发现一些意料之外的东西比如某个接口返回了调试信息、某个路径下可以直接列出文件。这些内容在后续的主动扫描里可以作为重点输入。提示被动扫描的规则可以在选项里逐条开关也能调整阈值。如果你的目标系统有大量误报比如某类响应头是框架自动加的、实际不影响安全可以针对性关掉对应规则让告警列表更干净。但关之前一定要搞清楚那条规则到底在检查什么别为了眼不见为净把真问题也关了。5. 主动扫描从爬虫到攻击面遍历被动扫描看完流量就结束了它的覆盖面取决于你手动点了多少页面。要系统性地遍历一个站点就得用主动扫描它包含两个关键环节爬虫和攻击规则检测。5.1 自动化扫描的完整流程ZAP 提供了一个自动化扫描的入口输入目标地址它会自动完成爬虫、被动扫描、主动扫描的串联。对于结构简单、不需要登录的站点这是最快的上手方式。流程大致是先启动爬虫把站点内的链接、表单、参数都摸一遍形成一张站点地图然后对地图里发现的每个可测点逐条跑主动扫描规则。这里有个细节需要注意自动化扫描默认不带认证信息如果目标系统需要登录才能访问核心功能那爬出来的地图基本是残缺的扫出来的结果自然也没意义。带认证的站点怎么处理下一节专门说。主动扫描对目标是有压力的它会尝试各种畸形输入、边界值、特殊字符组合。在共享环境或者资源紧张的服务上跑可能造成响应变慢甚至短时不可用。所以跑之前跟相关方打个招呼选低峰时段是很基本的职业素养。5.2 传统爬虫和 Ajax 爬虫怎么选现代前端大量使用异步加载页面点开时 HTML 里只有骨架真正的内容靠接口异步拉取。传统爬虫只解析 HTML遇到这种站点基本爬不出东西站点地图会非常单薄。这时候就要用支持 Ajax 的爬虫它会驱动一个真实的浏览器内核去执行页面脚本等内容渲染出来再解析链接。代价是速度慢很多资源占用也高。我的策略是先用传统爬虫快速跑一遍看看能覆盖多少如果覆盖明显不足再切到 Ajax 爬虫补齐。有些团队的做法是两者都跑一轮结果取并集覆盖率会更好代价是时间翻倍。# 命令行方式启动传统爬虫 zap-cli -p 8090 spider http://target.example.com # 启用 Ajax 爬虫需要先在界面里开启对应插件命令行参数以实际版本为准5.3 扫描策略与阈值调优主动扫描能测的规则非常多全开跑一个大站点可能要几个小时甚至更久。实际项目里我会根据目标特点做取舍。比如目标是个纯静态展示站那些针对数据库注入、命令执行的规则基本没发挥空间可以适当精简目标是个交互复杂的业务系统表单和参数特别多那就得留足时间让它跑完。扫描策略可以在选项里新建或修改针对不同强度的检查项设置启用与否。还有个容易被忽略的点是并发线程数默认值在小型目标上够用但目标服务性能强、你又有时间压力时适当调高能明显缩短总时长。调高之前要确认目标扛得住并发否则容易把服务压垮。6. 认证扫描与文件上传接口的处理这两块是实际项目里绕不开、又特别容易卡住新人的地方我单独拎出来讲。6.1 让扫描器带上登录状态需要登录才能访问的功能扫描器必须先拿到有效的会话。ZAP 提供的表单认证配置就是干这个的。你需要指定登录页面的地址、用户名和密码字段的名称、以及一个用来判断登录是否成功的标识。这个标识可以是一个只有登录后才出现的字符串比如某个用户昵称或者登录成功后跳转到的 URL 特征。配置好之后ZAP 会先发一次登录请求拿到会话 Cookie 或 Token后续所有扫描请求都带着这套凭据。判断标识设得准不准直接决定扫描能不能正常进行。如果标识太宽松登录失败时它也可能误判为成功导致后续扫描全是在未登录状态下跑的。配置完记得用界面上的验证按钮测一下确认能正确识别登录成功和失败两种状态。注意用来扫描的账号最好单独开一个权限和普通用户一致不要用管理员账号。扫描过程中可能触发密码修改、数据写入之类的操作用专用账号能把影响圈在最小范围。6.2 文件上传接口的检测思路文件上传是 Web 系统里问题高发的功能点也是很多实际案例的入口。OWASP ZAP 对这类接口的检查主要围绕上传的类型限制、内容校验、存储路径和回显方式展开。要扫到这些前提是爬虫得先发现上传表单并且知道各个字段的含义。实际操作里上传接口往往需要先登录、先拿到某些动态令牌甚至要经过多步操作才能到达。纯靠自动爬虫经常摸不到。我的做法是先用代理把整个上传流程手工走一遍让 ZAP 在历史记录里完整记录下这些请求然后在历史记录里右键那个上传请求选择针对性的扫描选项把上传相关字段交给扫描器去测。ZAP 有几个针对上传的检查插件可以测试上传特殊构造的文件名、测试服务端是否依赖前端校验、检查返回内容里是否直接暴露了上传文件的访问路径。这些检查触发时你会在告警里看到对应条目。需要提醒的是上传测试有一定的副作用可能真的往目标服务器上写文件所以务必在测试环境进行并且提前准备好清理方案。6.3 上下文和用户会话的管理当你要扫描的站点不止一个登录身份或者有多个功能模块需要不同权限时用上下文来组织会更清晰。一个上下文可以绑定一组 URL 范围、一套认证配置、一组会话管理规则。这样你在扫描 A 模块时不会误扫到 B 模块不同身份的扫描结果也不会混在一起。会话管理这块有些系统用的不是简单的 Cookie而是每次请求都要带一个动态计算的令牌或者用 OAuth 之类的机制。遇到这种ZAP 支持通过脚本来自定义会话处理逻辑。写脚本有一定门槛但一旦搞定后续所有扫描都能自动带上正确的凭据省去大量手工维护的麻烦。7. 报告输出与自动化集成扫描跑完了结果得能拿得出手、用得上不然白跑。7.1 报告类型和内容取舍ZAP 支持导出多种格式的报告常见的有 HTML、PDF、Markdown、XML、JSON。给人看的用 HTML 或 PDF排版友好能直接作为交付物给机器处理的用 JSON 或 XML方便接入其他平台做二次分析。报告里通常会把告警按风险等级分组每条包含描述、证据、请求响应、修复建议和参考链接。我的习惯是导出一份完整报告存档再手工整理一份精简版给开发团队。精简版只保留确认存在的问题去掉那些扫描器误报或者实际不可利用的条目并附上复现步骤和修复优先级。开发同学看完整报告容易被几百条告警淹没精简版更能推动问题落地。7.2 命令行与流水线集成命令行模式是 ZAP 真正体现工程价值的地方。它支持无界面运行可以在服务器上定时执行扫描任务把结果输出成文件再通过脚本判断是否存在高危问题决定是否阻断发布流程。# 无界面模式下对指定目标做一次快速扫描输出报告 zap.sh -cmd -quickurl http://target.example.com -quickout /tmp/zap-report.html # 需要更细粒度控制时用配置文件方式加载一套预设的扫描策略 zap.sh -cmd -autorun /path/to/plan.yaml把扫描塞进持续集成流程我踩过的一个坑是一开始把扫描放在每次代码提交后触发结果流水线时间被拉得很长而且大量提交根本没触及被测接口纯粹浪费资源。后来改成按天定时跑全量扫描再加上针对改动模块的增量扫描效率高了很多。另外一个经验是首次接入时先只把高危问题设为阻断条件等误报打磨干净了再收紧标准否则开发团队会被误报折腾到对这套机制失去信任。8. 常见问题与排查实录这部分是我这些年攒下来的实际问题按发生频率排序配上我的处理思路。8.1 扫不到内容、站点地图空得可怜这是新手反馈最多的问题。排查顺序我一般是这样第一确认代理有没有生效在 ZAP 历史记录里能不能看到流量看不到就是代理配置或证书问题第二确认目标是不是需要登录未登录状态下爬虫只能爬到公开页面第三确认站点是不是 Ajax 渲染的传统爬虫爬不动该换 Ajax 爬虫第四检查爬虫的作用域设置是不是把目标域名排除在外了第五看看有没有 robots 文件或者前端路由把路径藏起来了。还有一种情况是目标用了比较激进的反爬机制识别到扫描器特征后返回空内容或者直接拒绝。这种就得上认证扫描用真实登录态去访问同时适当降低请求频率模仿正常用户的操作节奏。8.2 误报太多告警列表没法看误报是扫描工具的通病ZAP 也不例外。处理思路分两层一是确认哪些规则在你的技术栈下天然会误报比如某些框架默认行为触发的、或者某些安全检查在前端做了但服务端不需要做的这些可以在规则层面关掉二是对每条误报做人工复核确认它确实不可利用然后在报告里标注说明。我一般会建一个项目专属的规则配置把误报规则的处理固化下来下次对同类系统扫描直接复用省去重复劳动。这个配置可以导出成文件在团队里共享。8.3 性能问题和资源占用扫描大站点时 ZAP 可能吃满内存界面卡顿甚至崩溃。处理方式有几个调大启动脚本里的最大堆内存参数扫描时用命令行模式而不是界面模式省掉界面渲染的开销把大站点拆成多个上下文分批扫描定期清理历史记录和旧的 session 文件。还有个隐蔽的坑是如果代理同时被多个浏览器或爬虫共用历史记录会迅速膨胀表单和响应的缓存也会拖慢响应。给扫描任务单独开一个 ZAP 实例别和日常抓包混用能避免很多莫名其妙的问题。8.4 常见问题速查表现象可能原因处理方向历史记录没有流量代理未生效、端口不对、防火墙拦截检查浏览器代理配置和本地端口监听HTTPS 站点报警告根证书未导入或未信任导出证书并导入到浏览器信任库爬虫覆盖极少目标为异步渲染、需要登录启用 Ajax 爬虫、配置认证扫描结果全是未登录状态认证判断标识设置不当用明确登录特征重新验证上传接口扫不到流程需多步操作、动态令牌手工走一遍流程后针对请求扫描扫描速度极慢规则全开、线程数低、目标响应慢精简规则、适度调高并发内存占用过高历史记录膨胀、堆内存不足清理会话、调大堆参数、分批扫描告警大量误报规则与目标技术栈不匹配复核后按项目关停对应规则8.5 我踩过的几个具体坑第一个坑是证书导入时只导入了顶层没导入到受信任的根证书机构导致浏览器一直提示不安全流量抓不全排查了半天才发现放错了位置。第二个坑是扫描时用了生产环境的账号结果某些检测规则真的修改了数据事后清理了好一阵。从那以后我坚持用专用测试账号并且扫描前先确认目标环境。第三个坑是第一次做流水线集成时把扫描结果直接当阻断条件几十条误报把发布流程堵死了后来改成先跑一段时间观察、人工梳理规则再逐步收紧才顺利落地。还有一个容易被忽略的点ZAP 的版本升级有时会改变默认规则集升级后同样的目标扫出来的结果可能和之前不一样。升级前把当前的规则配置导出备份升级后对比一下差异能避免结果波动带来的困惑。最后分享一个我常用的小技巧。对不熟悉的站点我会先用标准模式配合被动扫描手工把主要业务流程走一遍让 ZAP 把流量吃全然后停下来仔细看被动扫描的告警和站点地图。这一步基本能帮我摸清系统的大致结构、认证方式和可能的薄弱点。等心里有数了再切攻击模式针对具体模块做主动扫描。这个先摸后打的节奏比一上来就全自动扫描效率高得多也更不容易把目标搞出问题。
返回列表