在往期博文《带你体验一款主流且开源的Web漏洞扫描工具》中,我们介绍了如何使用ZAP进行手动Web安全扫描?你有没有想过通过对话方式就能完成一次安全扫描?接下来我们体验一款近期开源的安全MCP ZAP Server,看看它是如何通过一句话就来搞定Web安全测试的?
一、功能介绍:概览及各组件简介
MCP ZAP Server是一个基于 Spring Boot 的开源项目(项目地址:https://github.com/dtkmn/mcp-zap-server
),它可以将 OWASP ZAP 公开为 MCP(模型上下文协议)服务器,允许任何兼容 MCP 的 AI Agent(例如 Claude Desktop、Cursor、Cline)调度 ZAP 执行扫描操作——爬虫、主动扫描、导入 OpenAPI 规范以及生成报告。
各组件说明:
1. zap(OWASP ZAP镜像程序)
- 镜像: zaproxy/zap-stable
- 目的: 在端口 8090 上运行 OWASP ZAP 守护程序。
- 配置:
- 禁用 API 密钥。
- 接受来自所有地址的请求。
- 将主机目录
${LOCAL_ZAP_WORKPLACE_FOLDER}
映射到容器路径/zap/wrk
。
2. open-webui(也可用其他MCP客户端)
- 镜像: ghcr.io/open-webui/open-webui
- 目的: 提供用于管理 ZAP 和 MCP 服务器的 Web 界面。
- 配置:
- 公开端口 3000。
- 使用命名卷来保存后端数据。
3. mcpo
镜像: ghcr.io/open-webui/mcpo:main
用途: 将任何 MCP 工具公开为兼容 OpenAPI 的 HTTP 服务器。仅 open-webui 需要。项目地址:
https ://github.com/open-webui/mcpo
配置:
- 在端口 8000 上运行。
- 通过 URL
http://mcp-server:7456/sse
使用 SSE 连接到 MCP 服务器。
4. mcp-server
镜像: mcp-zap-server:latest
用途: 此 repo。充当公开 ZAP 操作的 MCP 服务器。
配置:
- 取决于 zap 服务。
- 公开端口 7456 以用于 HTTP SSE 连接。
- 将主机目录
${LOCAL_ZAP_WORKPLACE_FOLDER}
映射到 /tmp 以允许文件访问。
5. mcpo-filesystem
镜像: ghcr.io/open-webui/mcpo:main
目的: 将 MCP 文件系统服务器公开为与 OpenAPI 兼容的 HTTP 端点。
配置:
- 依赖于 open-webui
- 公开端口 8001。
6. juice-shop(漏洞靶场)
- 镜像: bkimminich/juice-shop
- 目的: 提供一个故意不安全的 Web 应用程序(靶场)来测试 ZAP 的扫描功能。
- 配置:
- 在端口 3001 上运行。
7. petstore(非必需)
- 镜像: swaggerapi/petstore3:unstable
- 目的: 运行 Swagger Petstore 示例 API 来演示 OpenAPI 导入和扫描。
- 配置:
- 在端口 3002 上运行。
需要注意的是,ZAP MCP Server在调用ZAP时默认使用了免认证方式,如果想启用认证,需要修改下docker-compose.yml
文件,将其中的ZAP API KEY替换为真实有效的KEY(个人本地测试用途非必须,建议生产用途时开启认证)。
二、安装配置:快速上手体验
1. 前提条件:
- 支持工具调用的LLM(例如 gpt-4o、Claude 3、Llama 3、Qwen3)
- Docker ≥ 20.10
- Docker Compose ≥ 1.29
满足以上条件后,依次执行如下几行命令:
git clone https://github.com/dtkmn/mcp-zap-server.git
cd mcp-zap-server
export LOCAL_ZAP_WORKPLACE_FOLDER=$(pwd)/zap-workplace # or any other folder you want to use as ZAP's workspace
docker-compose up -d
注:由于涉及镜像体积较大,约8G,最后一行命令
docker-compose up -d
预计需要20分钟左右才能完成,具体要取决于你的网速。
服务正常启动后端口信息如下,与我们第一章节各应用组件的介绍中所述端口是一致的。
2. 配置LLM
在浏览器中打开 http://localhost:3000
,可以看到 Open Web-UI 界面,进入链接http://localhost:3000/admin/settings/connections
设置连接,用于Open WebUI与大模型进行交互。
这里我配置了阿里云的LLM,阿里云上的每个模型都有100万tokens的免费额度,为了演示本案例已经够用。如果大家购买过其他模型厂商的token,类似方式去配置调用的URL和对应的API key即可。
阿里云LLM配置后,在模型中就可以加载出支持的大模型了。
3 配置MCP服务
接下来,如果要使用Open WebUI调用ZAP执行安全扫描,还需要设置ZAP的MCP服务器连接,用到两个地址:http://localhost:9090
和http://localhost:8001
。
4. 执行扫描
配置完成MCP服务后,就可以在Open WebUI上新建对话,同时可以指定大模型,然后就可以在聊天窗口中下发扫描指令,比如询问可用的工具。
相比于Open WebUI,我本人更喜欢使用Cline(功能强大,支持错误修正,自主执行等),直接在VS Code中安装cline插件,配置上LLM账户和MCP Server即可。如下为ZAP MCP Server的配置:
{
"mcpServers": {
"zap-mcp-server": {
"protocol": "mcp",
"transport": "http",
"url": "http://localhost:7456/sse"
}
}
}
打开Cline对话窗口,输入指令,比如:帮我对网址执行安全扫描:http://localhost:3001/
。
cline在扫描过程中会实时显示预览画面和任务进度、Token消耗等详细信息。
扫描完成后提示“Task Completed”,扫描过程中如果遇到错误会自行尝试修复,也可以人工介入。
完整扫描结果如下:
我完成了对 http://localhost:3001/ 的安全扫描,发现了以下主要安全问题:
1. 目录遍历漏洞:
- 可以通过 /ftp 路径访问服务器上的敏感文件
- 发现了多个敏感文件,包括:
* incident-support.kdbx (KeePass 数据库文件)
* acquisitions.md (包含机密商业信息)
* coupons_2013.md.bak
* suspicious_errors.yml
2. 敏感信息泄露:
- 可以下载 KeePass 数据库文件,这可能包含密码信息
- 机密商业文档 (acquisitions.md) 被公开访问
- 错误日志文件可能暴露系统内部信息
3. 访问控制不足:
- /admin 路径可以在没有认证的情况下访问
- /ftp 路径可以在没有授权的情况下访问
- 没有适当的文件访问权限控制
4. 安全头部信息不足:
- 缺乏内容安全策略 (Content-Security-Policy)
- 缺乏严格的缓存控制
- 缺乏HTTP严格传输安全 (HSTS)
建议立即采取以下措施:
1. 限制对敏感文件的访问,实施严格的访问控制
2. 移除或保护管理界面 (/admin, /ftp)
3. 添加完整的内容安全策略头
4. 实现身份验证和授权机制
5. 删除或保护敏感配置文件和数据库文件
6. 配置适当的缓存控制头
7. 添加 HSTS 头以确保 HTTPS 连接
关注我,让你在AI Agent时代不掉队! 🔥
每周更新:
- 💡 技术原理图解:一图胜千言,直观呈现技术架构
- 🛠️ 实战案例解析:结合真实项目经验,分享避坑指南
- 🤖 前沿技术追踪:第一时间解读AI、区块链等新兴领域
适合人群:
- ✅ 技术小白想系统入门
- ✅ 开发者想提升技术深度
- ✅ 产品经理需要技术洞察
- ✅ 所有对科技充满好奇的人
在这里你能获得:
- ✨ 复杂技术简单化
- ✨ 抽象概念具象化
- ✨ 理论知识实用化
- ✨ 学习路径清晰化