mcpField
D
dast-scanning

dast-scanning

github.com/bagelholeセキュリティ1.2k368 回インストール23 週間前に更新
リポジトリ

dast-scanning について

dast-scanningは、稼働中のWebアプリやAPIを評価するチーム向けの動的アプリケーションセキュリティテストガイドです。OWASP ZAPなどのツール、認証設定、自動化、CI/CDの例を扱います。

主な機能

  1. 01稼働中アプリのスキャン
  2. 02認証フローのテスト
  3. 03OpenAPI仕様を使ったAPIスキャン
  4. 04スキャンの自動化とレポート生成
  5. 05GitHub ActionsとGitLab CIとの連携

活用シーン

  1. 01デプロイ済みアプリの評価
  2. 02ステージング環境での定期スキャン
  3. 03APIセキュリティと認証フローの検証
  4. 04CI/CDへのDASTチェック追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/bagelhole/devops-security-agent-skills --skill dast-scanning

インストール後、Claude Code で/dast-scanningを入力して読み込まれたか確認します。

同梱ファイルreferences/dast-tools.md

詳細

DAST スキャン

動的解析を通じて、稼働中のアプリケーションのセキュリティ脆弱性をテストします。

このスキルを使用する場面

次のような場合にこのスキルを使用します:

  • デプロイ済みアプリケーションのテスト
  • 自動セキュリティスキャンの実施
  • 実行時の脆弱性の発見
  • 認証フローのテスト
  • API セキュリティの検証

前提条件

  • 稼働中のアプリケーションインスタンス
  • 対象へのネットワークアクセス
  • テストの認可
  • Web セキュリティに関する理解

ツールの概要

ツール種類最適な用途
OWASP ZAPOSS自動スキャン、CI
Burp Suite商用手動テスト、高度なテスト
NiktoOSSWeb サーバーのスキャン
NucleiOSSテンプレートベースのスキャン
ArachniOSS包括的なスキャン

OWASP ZAP

Docker のセットアップ
# Run ZAP in daemon mode
docker run -d --name zap \
  -p 8080:8080 \
  -v $(pwd)/reports:/zap/reports \
  ghcr.io/zaproxy/zaproxy:stable \
  zap.sh -daemon -host 0.0.0.0 -port 8080 \
  -config api.addrs.addr.name=.* \
  -config api.addrs.addr.regex=true
ベースラインスキャン
# Quick baseline scan
docker run --rm -v $(pwd):/zap/wrk \
  ghcr.io/zaproxy/zaproxy:stable \
  zap-baseline.py -t https://target.example.com \
  -r baseline-report.html

# With authentication
docker run --rm -v $(pwd):/zap/wrk \
  ghcr.io/zaproxy/zaproxy:stable \
  zap-baseline.py -t https://target.example.com \
  -r report.html \
  --auth-login-url https://target.example.com/login \
  --auth-username user \
  --auth-password pass
フルスキャン
# Comprehensive scan
docker run --rm -v $(pwd):/zap/wrk \
  ghcr.io/zaproxy/zaproxy:stable \
  zap-full-scan.py -t https://target.example.com \
  -r full-report.html \
  -J full-report.json
API スキャン
# OpenAPI specification scan
docker run --rm -v $(pwd):/zap/wrk \
  ghcr.io/zaproxy/zaproxy:stable \
  zap-api-scan.py -t https://target.example.com/openapi.json \
  -f openapi \
  -r api-report.html
ZAP Automation Framework
# zap-automation.yaml
env:
  contexts:
    - name: "Default Context"
      urls:
        - "https://target.example.com"
      includePaths:
        - "https://target.example.com/.*"
      excludePaths:
        - "https://target.example.com/logout.*"
      authentication:
        method: "form"
        parameters:
          loginUrl: "https://target.example.com/login"
          loginRequestData: "username={%username%}&password={%password%}"
        verification:
          method: "response"
          loggedInRegex: "\\QWelcome\\E"
      users:
        - name: "testuser"
          credentials:
            username: "[email protected]"
            password: "password123"

jobs:
  - type: spider
    parameters:
      context: "Default Context"
      user: "testuser"
      maxDuration: 10
      
  - type: spiderAjax
    parameters:
      context: "Default Context"
      user: "testuser"
      maxDuration: 10
      
  - type: passiveScan-wait
    parameters:
      maxDuration: 5
      
  - type: activeScan
    parameters:
      context: "Default Context"
      user: "testuser"
      policy: "Default Policy"
      
  - type: report
    parameters:
      template: "traditional-html"
      reportDir: "/zap/reports"
      reportFile: "zap-report"
# Run automation
docker run --rm -v $(pwd):/zap/wrk \
  ghcr.io/zaproxy/zaproxy:stable \
  zap.sh -cmd -autorun /zap/wrk/zap-automation.yaml

CI/CD との統合

GitHub Actions
name: DAST Scan

on:
  workflow_dispatch:
  schedule:
    - cron: '0 2 * * *'

jobs:
  dast:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Start Application
        run: |
          docker-compose up -d
          sleep 30  # Wait for app to be ready

      - name: OWASP ZAP Scan
        uses: zaproxy/[email protected]
        with:
          target: 'http://localhost:8080'
          rules_file_name: '.zap/rules.tsv'
          cmd_options: '-a'

      - name: Upload Report
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: zap-report
          path: report_html.html
GitLab CI
dast:
  stage: security
  image: ghcr.io/zaproxy/zaproxy:stable
  variables:
    TARGET_URL: $DAST_TARGET_URL
  script:
    - mkdir -p /zap/wrk/reports
    - zap-baseline.py -t $TARGET_URL -r /zap/wrk/reports/zap-report.html -I
  artifacts:
    paths:
      - reports/
    expire_in: 1 week
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

Burp Suite の自動化

REST API の使用
import requests

class BurpScanner:
    def __init__(self, api_url, api_key):
        self.api_url = api_url
        self.headers = {'Authorization': api_key}
    
    def create_scan(self, target_url):
        """Create and start a new scan."""
        payload = {
            'scan_configurations': [
                {'name': 'Crawl and Audit - Balanced'}
            ],
            'scope': {
                'include': [{'rule': target_url}]
            },
            'urls': [target_url]
        }
        response = requests.post(
            f'{self.api_url}/v0.1/scan',
            json=payload,
            headers=self.headers
        )
        return response.headers.get('Location')
    
    def get_scan_status(self, scan_id):
        """Get scan status."""
        response = requests.get(
            f'{self.api_url}/v0.1/scan/{scan_id}',
            headers=self.headers
        )
        return response.json()
    
    def get_issues(self, scan_id):
        """Get scan issues."""
        response = requests.get(
            f'{self.api_url}/v0.1/scan/{scan_id}/issues',
            headers=self.headers
        )
        return response.json()

# Usage
scanner = BurpScanner('http://burp:1337', 'api-key')
scan_id = scanner.create_scan('https://target.example.com')

while True:
    status = scanner.get_scan_status(scan_id)
    if status['scan_status'] == 'succeeded':
        break
    time.sleep(30)

issues = scanner.get_issues(scan_id)

Nikto

基本的なスキャン
# Install
apt-get install nikto

# Basic scan
nikto -h https://target.example.com

# With specific options
nikto -h https://target.example.com \
  -ssl \
  -Tuning 123bde \
  -output nikto-report.html \
  -Format html

# Scan specific ports
nikto -h target.example.com -p 80,443,8080

DAST でよく見つかる問題

OWASP Top 10
owasp_findings:
  A01_Broken_Access_Control:
    - IDOR vulnerabilities
    - Missing function-level access control
    - Privilege escalation
    
  A02_Cryptographic_Failures:
    - Sensitive data in URLs
    - Missing HTTPS
    - Weak ciphers
    
  A03_Injection:
    - SQL injection
    - Command injection
    - XSS
    
  A05_Security_Misconfiguration:
    - Default credentials
    - Verbose error messages
    - Missing security headers
    
  A07_Auth_Failures:
    - Weak passwords accepted
    - Session fixation
    - Missing MFA

セキュリティヘッダーのチェック

# Check security headers
curl -I https://target.example.com | grep -i "x-\|content-security\|strict"

# Expected headers:
# X-Content-Type-Options: nosniff
# X-Frame-Options: DENY
# X-XSS-Protection: 1; mode=block
# Content-Security-Policy: default-src 'self'
# Strict-Transport-Security: max-age=31536000

カスタムテストケース

# Test authentication
tests:
  - name: "Authentication Bypass"
    steps:
      - Access protected resource without auth
      - Verify 401/403 response
      - Access with valid auth
      - Verify 200 response
    
  - name: "Session Management"
    steps:
      - Login and capture session token
      - Logout
      - Attempt to use old session
      - Verify session invalidated
    
  - name: "Input Validation"
    steps:
      - Submit XSS payload in all inputs
      - Submit SQL injection in all inputs
      - Verify proper sanitization

よくある問題

問題:誤検知

問題:スキャナーが脆弱性ではないものを報告する 解決策:スキャンポリシーを設定し、検出結果を手動で確認します

問題:認証の欠落

問題:認証が必要な領域をスキャンできない 解決策:認証コンテキストを設定し、セッショントークンを使用します

問題:カバレッジの不足

問題:スキャナーがエンドポイントを見逃す 解決策:API 仕様をインポートし、スパイダリングを改善して、認証付きスキャンを使用します

ベストプラクティス

  • まずステージング環境でテストします
  • 適切な認証を設定します
  • 完全なカバレッジを得るために API 仕様をインポートします
  • 報告する前に検出結果を確認します
  • 手動テストと組み合わせます
  • 定期的にスキャンを実行します(最低でも週に1回)
  • 検出結果を経時的に追跡します
  • 開発チームと連携します

関連スキル

コメント