はじめに
Web アプリケーションのセキュリティ診断に広く使われているオープンソースツールが OWASP ZAP(Zed Attack Proxy) です。OWASP(Open Web Application Security Project)が開発・メンテナンスしており、無償で使えるにもかかわらずプロ用途にも耐えうる機能を備えています。
本記事では ZAP の概要と主要機能を整理し、特に「Webスパイダーリング」の仕組みについて掘り下げます。
alert
本記事の内容は教育・学習目的です。自分が管理・所有するシステム、または書面による明示的な許可を得たシステム以外には絶対に使用しないでください。無断のスキャンは不正アクセス禁止法に抵触します。
OWASP ZAP とは
OWASP ZAP は、Web アプリケーションの脆弱性を発見するための インターセプティングプロキシ(中間プロキシ) ツールです。ブラウザとサーバーの間に割り込み、HTTP/HTTPS トラフィックを観察・操作・分析します。
| 項目 | 内容 |
|---|---|
| 開発元 | OWASP(Open Web Application Security Project) |
| ライセンス | Apache License 2.0(無償) |
| 対応 OS | Windows / macOS / Linux |
| 言語 | Java(GUI あり、CLI あり) |
| 主な対象 | Web アプリケーション・REST API・GraphQL |
ZAP は 2010 年に Paros Proxy をフォークして誕生し、現在も活発に更新されています。2023 年からは ZAP 2.14 系が主流です。
Burp Suite との違い
ZAP を語るうえで必ず比較されるのが Burp Suite です。
| 比較軸 | OWASP ZAP | Burp Suite |
|---|---|---|
| 価格 | 無償(OSS) | Community 版は無償、Pro は有償($449/年〜) |
| 自動スキャン | 充実(Active Scan) | Pro 版のみ |
| 拡張性 | マーケットプレイス + スクリプト | BApp Store + Java 拡張 |
| 学習コスト | 比較的低い | やや高い |
| CI/CD 統合 | Docker イメージ提供、公式 GH Actions あり | 有償版で API 利用可能 |
| 向き | 開発者・学習者・OSS 志向 | 専業ペネトレーションテスター |
「まず試してみる」段階では ZAP が入りやすく、本格的なペネトレーションテスト業務では Burp Suite Pro が選ばれることが多い構図です。
ZAP のアーキテクチャ
ZAP がどのように動作するかを理解するため、基本的な通信フローを示します。
┌──────────┐ ┌──────────────┐ ┌─────────────┐
│ Browser │ ──→── │ ZAP Proxy │ ──→── │ Web Server │
│ │ ──←── │ (localhost) │ ──←── │ │
└──────────┘ └──────────────┘ └─────────────┘
│
┌──────┴──────┐
│ ZAP Engine │
│ ├ Spider │
│ ├ Scanner │
│ ├ Fuzzer │
│ └ Reporter │
└─────────────┘
ブラウザは ZAP をプロキシとして設定し、全リクエスト/レスポンスを ZAP 経由で送受信します。ZAP はこのトラフィックを記録しながら、各種の分析・攻撃モジュールを動かします。
Web スパイダーリングとは
基本概念
Web スパイダーリング(Web Spidering) とは、Web サイトを自動的に巡回して URL・フォーム・リンクを網羅的に収集するプロセスです。検索エンジンのクローラーと同じ仕組みで、セキュリティ診断の文脈では「攻撃対象面(Attack Surface)の洗い出し」に使います。
スパイダーの動作イメージ
/ ← スタート URL
├── /login
├── /products
│ ├── /products/1
│ ├── /products/2
│ └── /products/search?q=...
├── /api/v1/users
└── /admin ← 見落としがちな隠れパス
スパイダーが収集した URL すべてが、その後のスキャンやファジングの入力になります。収集漏れがあると、そこに潜む脆弱性が見つからないまま終わってしまいます。
ZAP の 2 種類のスパイダー
ZAP には目的に応じた 2 種類のスパイダーが搭載されています。
1. Traditional Spider(伝統的スパイダー)
HTML を解析し、<a href> タグ・フォームの action 属性・<script src> などの静的リンクを収集します。
仕組み
1. 指定 URL に HTTP GET リクエストを送信
2. レスポンスの HTML を解析してリンクを抽出
3. 未訪問の URL をキューに追加
4. キューが空になるまで繰り返す
特徴
- 処理が高速
- JavaScript を実行しない(SPA には不向き)
-
robots.txtを参照してスコープ外を除外できる
2. Ajax Spider(Ajax スパイダー)
内部で Selenium を使ってブラウザを実際に起動し、JavaScript を実行した状態でレンダリングされる URL を収集します。
仕組み
1. ヘッドレスブラウザ(Chromium / Firefox)を起動
2. ページを完全レンダリング(JS 実行 + DOM 構築)
3. クリック・スクロールで動的コンテンツを展開
4. 新たに出現した URL・API コールを収集
特徴
- React / Vue / Angular 等の SPA に対応
- Traditional Spider より処理時間がかかる
- 実際のユーザー操作を模倣できる(ログイン後の画面も探索可能)
どちらを使うか
┌─────────────────────────────────────────┐
│ HTML 主体の古典的 Web サイト │
│ → Traditional Spider で十分 │
├─────────────────────────────────────────┤
│ React / Vue / Angular などの SPA │
│ Next.js / Nuxt などの SSR + CSR 混在 │
│ → Ajax Spider を使う(または併用) │
├─────────────────────────────────────────┤
│ REST API / GraphQL のみ │
│ → OpenAPI 定義を ZAP にインポートする │
│ スパイダー不要でエンドポイントを網羅 │
└─────────────────────────────────────────┘
ZAP の主要機能
1. パッシブスキャン(Passive Scan)
パッシブスキャン はプロキシを流れるトラフィックを観察するだけで、サーバーに余分なリクエストを送りません。
検出できる問題の例
├── セキュリティヘッダの欠如
│ ├── X-Content-Type-Options: nosniff がない
│ ├── Content-Security-Policy がない
│ └── Strict-Transport-Security がない
├── Cookie の Secure / HttpOnly フラグ欠如
├── レスポンスに含まれる機密情報の漏洩(スタックトレースなど)
└── 古い TLS バージョンの使用
ブラウザで通常の操作をするだけで自動的に記録・分析されるため、アプリの通常利用フローに乗せて診断できます。
2. アクティブスキャン(Active Scan)
アクティブスキャン は実際に攻撃ペイロードをサーバーに送り込み、脆弱性を検出します。
スキャン対象の脆弱性カテゴリ(OWASP Top 10 対応)
├── SQL インジェクション
├── XSS(クロスサイトスクリプティング)
├── SSRF(サーバーサイドリクエストフォージェリ)
├── パストラバーサル(ディレクトリトラバーサル)
├── コマンドインジェクション
├── XML インジェクション / XXE
├── LDAP インジェクション
└── Remote File Inclusion(RFI)
アクティブスキャンは対象サーバーに大量のリクエストを送るため、必ず自分が管理・許可を得た環境でのみ実行してください。
3. ファジング(Fuzzing)
特定のリクエストパラメータやヘッダに対して、大量のペイロードを送り込んでレスポンスの変化を観察します。
# ZAP CLI でファジングを実行するイメージ(Fuzzer スクリプト例)
zap-cli --port 8080 fuzz \
--url "http://target.local/search?q=FUZZ" \
--fuzz-file /usr/share/wordlists/payloads.txt
4. 認証ハンドリング
ZAP はセッション管理と認証をサポートします。
対応している認証方式
├── フォーム認証(ユーザー名/パスワードフォーム)
├── HTTP Basic / Digest 認証
├── OAuth 2.0 / Bearer Token
└── スクリプトベース認証(独自実装にも対応)
ログインが必要なページも、認証設定を正しく行えばスパイダーやスキャンの対象に含められます。
ZAP のセットアップと基本的な使い方
インストール
# macOS(Homebrew)
brew install --cask owasp-zap
# Linux(Snap)
sudo snap install zaproxy --classic
# Docker(CI 環境向け)
docker pull ghcr.io/zaproxy/zaproxy:stable
プロキシ設定
ZAP のデフォルトプロキシは localhost:8080 です。ブラウザのプロキシ設定をここに向けます。
Firefox の場合:
設定 → 一般 → ネットワーク設定 → 手動でプロキシを設定
HTTP プロキシ: 127.0.0.1 ポート: 8080
HTTPS にも使用: チェックを入れる
HTTPS を傍受するには ZAP の CA 証明書をブラウザに信頼済みとして登録します。
ZAP GUI: Tools → Options → Dynamic SSL Certificates
→ Generate → 証明書を .cer でエクスポート
→ ブラウザの証明書ストアにインポート
スパイダーの実行(GUI)
1. ZAP GUI を起動
2. ターゲット URL を入力し「Automated Scan」または「Manual Explore」を選択
3. 左ペインの「Sites」ツリーにターゲットが追加される
4. ターゲットを右クリック → Attack → Spider...
5. Traditional Spider または Ajax Spider を選択して Start Scan
6. 下部の「Spider」タブで進捗を確認
スパイダー + スキャンの自動実行(CLI / Docker)
開発パイプラインに組み込む場合は Docker でのワンライナー実行が便利です。
# Baseline Scan(パッシブスキャンのみ)
docker run --rm ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \
-t https://target.example.com \
-r report.html
# Full Scan(スパイダー + アクティブスキャン)
docker run --rm ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py \
-t https://target.example.com \
-r report.html
# API Scan(OpenAPI/Swagger 定義から)
docker run --rm ghcr.io/zaproxy/zaproxy:stable zap-api-scan.py \
-t https://target.example.com/openapi.json \
-f openapi \
-r report.html
GitHub Actions への組み込み例
# .github/workflows/zap-scan.yml
name: ZAP Security Scan
on:
push:
branches: [main]
jobs:
zap_scan:
runs-on: ubuntu-latest
steps:
- name: ZAP Baseline Scan
uses: zaproxy/action-baseline@v0.12.0
with:
target: 'https://staging.example.com'
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a'
ZAP の拡張機能(アドオン)
ZAP は マーケットプレイス(Add-on Marketplace) から機能を追加できます。
| アドオン | 用途 |
|---|---|
| FuzzDB Files | ファジング用ペイロード集(SQL/XSS/LFI など) |
| HUD(Heads Up Display) | ブラウザ上に ZAP の情報をオーバーレイ表示 |
| OpenAPI Support | Swagger/OpenAPI 定義を読み込んでスキャン |
| GraphQL Support | GraphQL スキーマのイントロスペクションとスキャン |
| Retire.js | 既知の脆弱な JS ライブラリを検出 |
| Active Scan Input Vectors | リクエストの JSON/XML ボディへのスキャン対応 |
| Ajax Spider | JavaScript 実行対応のスパイダー |
スキャン結果の読み方
ZAP は検出した問題をリスクレベル別に分類します。
| リスクレベル | 色 | 概要 |
|---|---|---|
| High | 赤 | 即時対応が必要。データ漏洩・システム侵害につながる |
| Medium | オレンジ | 早めの対応を推奨。悪用可能な設定ミスや弱点 |
| Low | 黄 | 軽微だが改善が望ましい |
| Informational | 青 | 攻撃ではないが診断者の参考情報 |
| False Positive | 灰 | 誤検知としてマーク済み |
レポートには各アラートに対して以下が含まれます。
アラート詳細の構成
├── 脆弱性の説明
├── 証拠(Evidence):実際のリクエスト/レスポンスの該当箇所
├── CWE ID(共通脆弱性タイプ識別子)
├── WASC ID(Web Application Security Consortium)
└── 推奨される対策(Solution)
実践例:DVWA を使ったスキャン
DVWA(Damn Vulnerable Web Application) はセキュリティ学習用の意図的に脆弱な Web アプリです。ZAP の練習台として最適です。
# DVWA を Docker で起動
docker run --rm -p 80:80 vulnerables/web-dvwa
# ZAP でスキャン(別ターミナルで)
docker run --rm --network host ghcr.io/zaproxy/zaproxy:stable \
zap-full-scan.py \
-t http://localhost \
-r dvwa_report.html
他にも公式の練習環境として以下が利用できます。
| 環境 | 特徴 |
|---|---|
| DVWA | PHP 製。SQL インジェクション・XSS など基本的な脆弱性を網羅 |
| WebGoat | OWASP 公式の教育用アプリ。解説付きのチャレンジ形式 |
| Juice Shop | OWASP 公式。Node.js 製 SPA で現代的な構成 |
| HackTheBox / TryHackMe | オンラインの CTF・ラボ環境 |
ZAP を使う際の注意点
スコープの設定
ZAP では診断対象の URL 範囲を「スコープ(Scope)」として定義します。スコープ外の URL へのリクエストを誤って送らないよう、スコープを正しく設定することが重要です。
スコープ設定例
対象: https://target.example.com/*
除外: https://target.example.com/admin/delete/*
https://target.example.com/payment/*
スキャン強度と負荷
アクティブスキャンの強度は変更できます。本番環境に近い環境では低〜中強度からスタートし、サービスへの影響がないか確認してから強度を上げます。
Scan Policy の強度設定
├── Default Policy(デフォルト)
├── Low → リクエスト数が少ない
├── Medium → バランス型
└── High → 徹底的だが負荷が高い
ログの保持
ZAP のセッションファイル(.session)にはスキャン中の全 HTTP トラフィックが記録されます。認証情報やトークンが含まれる可能性があるため、取り扱いに注意してください。
まとめ
OWASP ZAP で押さえておくべきポイントを整理します。
ZAP の全体像
ZAP
├── プロキシ機能
│ └── HTTP/HTTPS のインターセプト・改ざん
├── スパイダー
│ ├── Traditional Spider:静的 HTML リンクの自動収集
│ └── Ajax Spider:JS 実行後の動的リンクも収集
├── スキャン
│ ├── Passive Scan:傍受のみ(サーバー無負荷)
│ └── Active Scan:ペイロード送信で脆弱性を検出
├── ファジング:パラメータへの大量ペイロード投入
├── 認証ハンドリング:ログイン後の領域も診断可能
└── レポート生成:HTML / JSON / XML で出力
Web スパイダーリングは「攻撃対象面の地図を描く」フェーズです。Traditional Spider で静的リンクを押さえ、Ajax Spider で SPA の動的部分を補完することで、診断の抜け漏れを防ぐことができます。
ZAP を使うときは必ず自分が管理・許可を受けたシステムのみを対象にし、本番環境への誤爆を防ぐスコープ設定を習慣にしてください。
参考
- OWASP ZAP 公式サイト
- ZAP Getting Started
- ZAP Docker Hub
- OWASP Top 10
- DVWA - Damn Vulnerable Web Application
この記事はZennでも公開しています。