dynamic-application-security-testing について
実行中のWebアプリやAPIを対象に、エージェントが動的セキュリティテストを行うためのスキルです。セキュリティ担当者や開発チーム向けに、スキャン設定、検出結果の検証、修正レポート作成を扱い、許可された範囲と影響の抑制を重視します。
主な機能
- 01スキャン範囲と方針の設定
- 02ログインとAPI認証の設定
- 03WebアプリとAPIのスキャン
- 04検出結果の分類と検証
- 05修正案付きレポートの作成
- 06スキャンの定期実行と結果比較
活用シーン
- 01ステージング環境のWebアプリの脆弱性確認
- 02認証が必要なAPIエンドポイントのテスト
- 03デプロイ後のスキャン結果の比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ seb1n/ awesome-ai-agent-skills --skill dynamic-application-security-testingインストール後、Claude Code で/dynamic-application-security-testingを入力して読み込まれたか確認します。
詳細
動的アプリケーションセキュリティテスト
このスキルを使用すると、エージェントは稼働中の Web アプリケーションや API に対して動的アプリケーションセキュリティテスト(DAST)を実行できます。静的解析とは異なり、DAST は実行時にアプリケーションとやり取りします。細工した HTTP リクエストの送信、入力パラメーターのファジング、レスポンスの分析を行い、SQL インジェクション、クロスサイトスクリプティング、サーバーの設定ミス、認証の不備、安全でない API エンドポイントなどの脆弱性を検出します。エージェントはスキャンプロファイルを設定し、認証済みスキャンを処理して、結果を解釈し、実行可能な修正レポートを作成します。
ワークフロー
-
対象範囲とスキャンポリシーを定義する — 対象 URL、アプリケーションの種類(従来型の Web アプリ、SPA、REST API、GraphQL)、スキャン範囲を指定します。意図しない対象をスキャンしないよう、対象に含めるパスとドメインを定義します。スキャンポリシーとして、リスクの低い偵察向けのパッシブのみ、脆弱性を全面的に検査するアクティブ、またはエンドポイントのファジング向けの API 固有のポリシーを選択します。
-
認証を設定する — ログインが必要なアプリケーションでは、有効な認証情報またはセッショントークンをスキャナーに設定します。ログイン URL、ユーザー名/パスワードのフィールド、ログイン済みであることを示す文字列を指定して、フォームベース認証を設定します。API のテストでは、スキャナーが認証済みのエンドポイントにアクセスできるよう、Bearer トークン、API キー、または OAuth フローを設定します。
-
DAST スキャンを実行する — 選択したツール(OWASP ZAP、Burp Suite、または Nuclei)を使用してスキャンを開始します。スキャナーはまずアプリケーションをクロールしてエンドポイントを検出し、次に各エンドポイントを攻撃ペイロードでアクティブに検査します。対象環境に過度な負荷をかけないよう、スキャンの進捗とリソース消費を監視します。
-
検出結果を分析して分類する — スキャン結果を確認し、各検出結果を脆弱性の種類、重大度(CVSS を使用)、信頼度、影響を受ける URL に基づいて分類します。報告されたレスポンスが実際に脆弱性を示していることを検証し、情報のみのノイズや誤検知を除外します。
-
修正レポートを作成する — 脆弱な URL、HTTP リクエスト/レスポンスの証拠、重大度評価、CWE 識別子、OWASP カテゴリーとの対応付け、具体的な修正方法を各検出結果に含めた、構造化レポートを作成します。課題トラッカーとの連携用に、HTML、JSON、または SARIF 形式でエクスポートします。
-
定期スキャンをスケジュールする — 定期的なスケジュール(例:ステージング環境に対して毎晩)でスキャンを実行するよう設定するか、QA 環境へのデプロイ時に実行します。スキャン実行ごとの結果を比較して、修正の進捗を追跡し、新たに持ち込まれた脆弱性を検出します。
対応技術
- DAST ツール:OWASP ZAP、Burp Suite Professional/Enterprise、Nuclei、Nikto、Arachni
- 対象の種類:従来型の Web アプリ、シングルページアプリケーション(React、Angular、Vue)、REST API、GraphQL API、WebSocket エンドポイント
- 認証:フォームベースログイン、HTTP Basic/Digest、Bearer トークン、API キー、OAuth 2.0 フロー
- 出力形式:HTML レポート、JSON、XML、SARIF、Markdown
- CI/CD 連携:GitHub Actions、GitLab CI、Jenkins、Azure Pipelines
使用方法
対象 URL、必要に応じて認証情報、希望するスキャンの深さをエージェントに伝えます。エージェントはスキャナーを設定してテストを実行し、優先順位付けされた検出結果レポートを提供します。
プロンプトの例:
Run a DAST scan against our staging application at https://staging.example.com. Use OWASP ZAP with the login form at /login (username: testuser, password: Test@1234). Scan all API endpoints under /api/v2 and generate an HTML report.
例
例 1:Web アプリケーションに対する OWASP ZAP スキャン
認証付きの ZAP Docker コマンド:
docker run --rm -v $(pwd)/report:/zap/wrk owasp/zap2docker-stable zap-full-scan.py \
-t https://staging.example.com \
-r zap-report.html \
-J zap-report.json \
-c zap-config.conf \
--hook=zap-auth-hook.py \
-z "-config formhandler.fields.field(0).fieldId=username \
-config formhandler.fields.field(0).value=testuser \
-config formhandler.fields.field(1).fieldId=password \
-config formhandler.fields.field(1).value=Test@1234"
検出結果レポート(抜粋):
| # | リスク | アラート | URL | CWE | OWASP | 信頼度 |
|---|---|---|---|---|---|---|
| 1 | 高 | SQL インジェクション | POST /api/v2/search | CWE-89 | A03:2021 | 高 |
| 2 | 高 | クロスサイトスクリプティング(反射型) | GET /search?q=<script> | CWE-79 | A03:2021 | 高 |
| 3 | 中 | Anti-CSRF トークンの欠落 | POST /api/v2/profile/update | CWE-352 | A01:2021 | 中 |
| 4 | 中 | Secure フラグのない Cookie | Set-Cookie: session=... | CWE-614 | A05:2021 | 高 |
| 5 | 低 | X-Content-Type-Options ヘッダーの欠落 | すべてのレスポンス | CWE-693 | A05:2021 | 高 |
| 6 | 低 | サーバーのバージョン情報漏えい | Server: Apache/2.4.49 | CWE-200 | A05:2021 | 高 |
検出結果 #1 — SQL インジェクションの証拠:
Request:
POST /api/v2/search HTTP/1.1
Content-Type: application/json
{"query": "test' OR '1'='1' --"}
Response:
HTTP/1.1 200 OK
[returned all 4,892 records instead of matching records]
Remediation: Use parameterized queries or ORM methods. Validate and sanitize
all user input before including it in database queries.
例 2:公開されたデバッグエンドポイントを検出するカスタム Nuclei テンプレート
カスタムテンプレート(exposed-debug-endpoints.yaml):
id: exposed-debug-endpoints
info:
name: Exposed Debug/Admin Endpoints
author: security-team
severity: high
description: Detects debug and admin endpoints that should not be publicly accessible.
tags: misconfiguration,exposure
classification:
cwe-id: CWE-489
cvss-score: 7.5
http:
- method: GET
path:
- "{{BaseURL}}/debug"
- "{{BaseURL}}/actuator"
- "{{BaseURL}}/actuator/env"
- "{{BaseURL}}/graphql/playground"
- "{{BaseURL}}/_profiler"
- "{{BaseURL}}/elmah.axd"
- "{{BaseURL}}/phpinfo.php"
stop-at-first-match: false
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "debug"
- "actuator"
- "environment"
- "playground"
condition: or
スキャンの実行:
nuclei -u https://staging.example.com -t exposed-debug-endpoints.yaml -t cves/ -severity high,critical -json -o nuclei-results.json
出力例:
[exposed-debug-endpoints] [http] [high] https://staging.example.com/actuator/env
[exposed-debug-endpoints] [http] [high] https://staging.example.com/graphql/playground
[CVE-2021-44228] [http] [critical] https://staging.example.com/api/v2/log
ベストプラクティス
- 本番環境ではなく、ステージング環境をスキャンする — DAST は攻撃ペイロードを積極的に送信するため、データの破損やアラートの発生、サービス停止を引き起こす可能性があります。本番環境を模したステージング環境または QA 環境を必ず対象にしてください。
- パッシブスキャンとアクティブスキャンを組み合わせる — まず、攻撃ペイロードを送信せずにアプリケーションをマッピングするパッシブスパイダーを実行し、その後、検出したエンドポイントに対してアクティブスキャンを実行して、網羅的に調査します。
- 認証を正しく設定する — 未認証の DAST スキャンでは、ログインページと公開エンドポイントしかテストできません。実際の脆弱性の多くは認証が必要なフローの先にあるため、有効なセッション認証情報を必ず設定してください。
- スキャン範囲の境界を設定する — 対象範囲に含めるドメインとパスを明示的に定義してください。境界を設定しないと、スキャナーがサードパーティーのサイト、CDN、または決済プロバイダーへのリンクをたどり、意図しない結果を招く可能性があります。
- スキャンのベースラインを時系列で比較する — スキャン結果を保存し、新しい実行結果を前回のベースラインと比較してください。これにより、新たに持ち込まれた脆弱性を発見し、以前に報告された問題が修正されたことを確認できます。
- DAST と SAST を組み合わせる — DAST は SAST が見逃す実行時の問題(設定ミス、デプロイエラー)を検出し、SAST は DAST では到達できないコードレベルの欠陥を検出します。包括的にカバーするため、両方を使用してください。
安全上の境界
- ユーザーが所有するシステム、または評価の明示的な許可を得たシステムのみを対象とし、テスト前に承認された範囲を記録してください。
- パッシブまたは読み取り専用の調査から始めてください。アクティブスキャン、悪用、負荷の生成、またはサービスを妨げる修復を行う前に、明示的な承認を得てください。
- シークレットを漏えいさせたり、無関係なデータを抽出したり、本番環境の制御を弱めたり、承認された対象範囲を超えたりしないでください。
- 証拠を保全し、影響を最小限に抑え、不安定な状態になったら停止し、重要な変更には必ずロールバックまたは封じ込めの手順を提示してください。
エッジケース
- クライアントサイドルーティングを使用するシングルページアプリケーション — 従来のスパイダーでは、React、Angular、Vue のアプリ内のルートを検出できません。リンクが JavaScript によって描画されるためです。SPA のエンドポイントを適切に検出するには、ZAP の AJAX Spider またはヘッドレスブラウザーベースのクローラーを使用してください。
- UI のない API 専用アプリケーション — スパイダーでクロールする Web UI がない場合は、OpenAPI/Swagger 仕様または Postman コレクションをスキャナーに直接インポートして、すべてのエンドポイント、パラメーター、想定されるリクエスト形式を定義してください。
- レート制限または WAF で保護されたターゲット — 積極的なスキャンはレート制限や WAF によるブロックを引き起こし、偽陰性につながる場合があります。スキャン速度を抑える、スキャナーの IP アドレスを WAF の許可リストに追加する、または正確な結果を得るためにオリジンサーバーを直接テストしてください。
- WebSocket とリアルタイムのエンドポイント — ほとんどの DAST ツールは HTTP のリクエスト/レスポンスパターンに重点を置いています。WebSocket 接続のリアルタイムなメッセージフローにおけるインジェクションや認可の問題を調べるには、専用ツールまたは手動テストが必要です。
- 状態を持つ複数ステップのワークフロー — チェックアウト、パスワードリセット、MFA 登録などのフローにおける脆弱性を検出するには、スキャナーが特定の手順に従う必要があります。スキャンシーケンスを定義するか、記録したマクロを使用して、これらのワークフローを最初から最後までテストしてください。