Tenable Web App Scanning

Tenable Web App Scanning

Category: DAST
License: Commercial

Tenable Web App Scanning is a cloud-based dynamic application security testing (DAST) solution that combines web application vulnerability scanning with comprehensive API security testing.

Built on Nessus technology and integrated with Tenable’s attack surface management capabilities, the platform provides unified visibility into web application security risks.

What is Tenable Web App Scanning?

Tenable Web App Scanning delivers automated security testing for web applications and APIs without requiring source code access.

The platform scans running applications to identify vulnerabilities that could be exploited by attackers, covering traditional web application flaws as well as modern API security concerns.

The scanner supports REST, GraphQL, and SOAP APIs alongside traditional web applications, making it suitable for organizations with diverse application architectures.

Integration with Tenable’s broader vulnerability management platform enables security teams to correlate web application vulnerabilities with infrastructure risks for comprehensive security visibility.

Key Features

API Security Testing

Tenable Web App Scanning provides extensive API testing capabilities:

  • REST API Scanning: Automated discovery and testing of RESTful endpoints
  • GraphQL Support: Query analysis and mutation testing for GraphQL APIs
  • SOAP Web Services: WSDL-based testing for legacy SOAP services
  • OpenAPI Import: Import OpenAPI/Swagger specifications to guide API testing
  • Authentication Testing: OAuth 2.0, API keys, JWT, and custom authentication methods

Attack Surface Management Integration

The platform integrates with Tenable Attack Surface Management (ASM) to provide:

  • Automatic discovery of web applications and APIs across your digital footprint
  • Continuous monitoring for new or changed applications
  • Risk prioritization based on internet exposure
  • Shadow IT detection for web properties

Flexible Scan Controls

Tenable provides granular control over scanning operations:

  • Pause/Resume: Stop scans during maintenance windows and resume later
  • Rate Limiting: Configure request rates to avoid impacting production systems
  • Scheduling: Set up recurring scans on custom schedules
  • Scope Control: Define included and excluded URL patterns

Nessus-Powered Engine

Built on Tenable’s proven Nessus scanning technology, the platform delivers:

  • Comprehensive vulnerability detection across OWASP Top 10 categories
  • Regular vulnerability check updates from Tenable’s research team
  • Low false positive rates through verification techniques
  • Detailed remediation guidance for discovered issues

Getting Started

Tenable Web App Scanning is a cloud-native service accessed through the Tenable platform.

Initial Setup

  1. Log in to your Tenable.io account
  2. Navigate to Web App Scanning section
  3. Add your first application target
  4. Configure authentication if needed
  5. Run your initial scan

CLI Usage with Tenable API

# Set up API credentials
export TENABLE_ACCESS_KEY="your-access-key"
export TENABLE_SECRET_KEY="your-secret-key"

# Create a new web application scan
curl -X POST "https://cloud.tenable.com/was/v2/scans" \
  -H "X-ApiKeys: accessKey=$TENABLE_ACCESS_KEY;secretKey=$TENABLE_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production App Scan",
    "targets": ["https://app.example.com"],
    "schedule": {
      "enabled": true,
      "type": "weekly"
    }
  }'

# Launch a scan
curl -X POST "https://cloud.tenable.com/was/v2/scans/{scan_id}/launch" \
  -H "X-ApiKeys: accessKey=$TENABLE_ACCESS_KEY;secretKey=$TENABLE_SECRET_KEY"

# Get scan results
curl -X GET "https://cloud.tenable.com/was/v2/scans/{scan_id}/report" \
  -H "X-ApiKeys: accessKey=$TENABLE_ACCESS_KEY;secretKey=$TENABLE_SECRET_KEY"

Python SDK Example

from tenable.io import TenableIO

# Initialize the client
tio = TenableIO(
    access_key='your-access-key',
    secret_key='your-secret-key'
)

# Create a web application scan
scan = tio.was.scans.create(
    name='Production Web App Scan',
    targets=['https://app.example.com'],
    schedule={
        'enabled': True,
        'type': 'weekly',
        'start_time': '2026-02-10T02:00:00Z'
    }
)

# Launch the scan
tio.was.scans.launch(scan['scan_id'])

# Get scan status
status = tio.was.scans.status(scan['scan_id'])
print(f"Scan status: {status['status']}")

CI/CD Integration

GitHub Actions

name: Tenable Web App Security Scan
on:
  push:
    branches: [main]
  schedule:
    - cron: '0 2 * * 0'  # Weekly Sunday 2 AM

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

      - name: Deploy to Staging
        run: |
          # Deploy your application to staging
          echo "Deploying..."

      - name: Wait for Deployment
        run: sleep 60

      - name: Trigger Tenable WAS Scan
        env:
          TENABLE_ACCESS_KEY: ${{ secrets.TENABLE_ACCESS_KEY }}
          TENABLE_SECRET_KEY: ${{ secrets.TENABLE_SECRET_KEY }}
        run: |
          # Launch scan
          RESPONSE=$(curl -s -X POST \
            "https://cloud.tenable.com/was/v2/scans/${{ vars.SCAN_ID }}/launch" \
            -H "X-ApiKeys: accessKey=$TENABLE_ACCESS_KEY;secretKey=$TENABLE_SECRET_KEY")

          SCAN_RUN_ID=$(echo $RESPONSE | jq -r '.scan_run_id')
          echo "scan_run_id=$SCAN_RUN_ID" >> $GITHUB_OUTPUT

      - name: Wait for Scan Completion
        env:
          TENABLE_ACCESS_KEY: ${{ secrets.TENABLE_ACCESS_KEY }}
          TENABLE_SECRET_KEY: ${{ secrets.TENABLE_SECRET_KEY }}
        run: |
          while true; do
            STATUS=$(curl -s \
              "https://cloud.tenable.com/was/v2/scans/${{ vars.SCAN_ID }}/status" \
              -H "X-ApiKeys: accessKey=$TENABLE_ACCESS_KEY;secretKey=$TENABLE_SECRET_KEY" \
              | jq -r '.status')

            if [ "$STATUS" = "completed" ]; then
              echo "Scan completed"
              break
            elif [ "$STATUS" = "failed" ]; then
              echo "Scan failed"
              exit 1
            fi

            echo "Scan status: $STATUS"
            sleep 60
          done

      - name: Download Results
        env:
          TENABLE_ACCESS_KEY: ${{ secrets.TENABLE_ACCESS_KEY }}
          TENABLE_SECRET_KEY: ${{ secrets.TENABLE_SECRET_KEY }}
        run: |
          curl -s \
            "https://cloud.tenable.com/was/v2/scans/${{ vars.SCAN_ID }}/report?format=json" \
            -H "X-ApiKeys: accessKey=$TENABLE_ACCESS_KEY;secretKey=$TENABLE_SECRET_KEY" \
            -o tenable-was-results.json

      - name: Upload Results
        uses: actions/upload-artifact@v4
        with:
          name: tenable-was-report
          path: tenable-was-results.json

GitLab CI

tenable-was-scan:
  stage: security
  image: python:3.11-slim
  variables:
    TENABLE_ACCESS_KEY: $TENABLE_ACCESS_KEY
    TENABLE_SECRET_KEY: $TENABLE_SECRET_KEY
  before_script:
    - pip install pytenable
  script:
    - |
      python << 'EOF'
      from tenable.io import TenableIO
      import os
      import time
      import json

      tio = TenableIO(
          access_key=os.environ['TENABLE_ACCESS_KEY'],
          secret_key=os.environ['TENABLE_SECRET_KEY']
      )

      # Launch scan
      scan_id = os.environ.get('SCAN_ID')
      tio.was.scans.launch(scan_id)

      # Wait for completion
      while True:
          status = tio.was.scans.status(scan_id)
          if status['status'] == 'completed':
              break
          elif status['status'] == 'failed':
              raise Exception('Scan failed')
          time.sleep(60)

      # Get results
      results = tio.was.scans.results(scan_id)
      with open('gl-dast-report.json', 'w') as f:
          json.dump(results, f)
      EOF
  artifacts:
    reports:
      dast: gl-dast-report.json
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Jenkins Pipeline

pipeline {
    agent any

    environment {
        TENABLE_ACCESS_KEY = credentials('tenable-access-key')
        TENABLE_SECRET_KEY = credentials('tenable-secret-key')
        SCAN_ID = 'your-scan-id'
    }

    stages {
        stage('Deploy to Staging') {
            steps {
                sh 'echo "Deploying application..."'
            }
        }

        stage('DAST Scan') {
            steps {
                script {
                    // Launch Tenable WAS scan
                    sh '''
                        curl -X POST \
                          "https://cloud.tenable.com/was/v2/scans/${SCAN_ID}/launch" \
                          -H "X-ApiKeys: accessKey=${TENABLE_ACCESS_KEY};secretKey=${TENABLE_SECRET_KEY}"
                    '''

                    // Wait and poll for completion
                    def completed = false
                    while (!completed) {
                        def status = sh(
                            script: '''
                                curl -s \
                                  "https://cloud.tenable.com/was/v2/scans/${SCAN_ID}/status" \
                                  -H "X-ApiKeys: accessKey=${TENABLE_ACCESS_KEY};secretKey=${TENABLE_SECRET_KEY}" \
                                  | jq -r '.status'
                            ''',
                            returnStdout: true
                        ).trim()

                        if (status == 'completed') {
                            completed = true
                        } else if (status == 'failed') {
                            error 'Tenable WAS scan failed'
                        }
                        sleep 60
                    }
                }
            }
        }
    }

    post {
        always {
            sh '''
                curl -s \
                  "https://cloud.tenable.com/was/v2/scans/${SCAN_ID}/report?format=html" \
                  -H "X-ApiKeys: accessKey=${TENABLE_ACCESS_KEY};secretKey=${TENABLE_SECRET_KEY}" \
                  -o tenable-was-report.html
            '''
            archiveArtifacts artifacts: 'tenable-was-report.html'
        }
    }
}

When to Use Tenable Web App Scanning

Tenable Web App Scanning is well-suited for:

  • Existing Tenable customers: Organizations using Tenable.io for vulnerability management benefit from unified dashboards and correlated risk visibility
  • API-heavy architectures: Strong support for REST, GraphQL, and SOAP APIs makes it suitable for microservices environments
  • Attack surface management needs: Integration with Tenable ASM helps discover and secure shadow IT web properties
  • Cloud-native organizations: The SaaS delivery model requires no infrastructure management

Consider alternatives if you need:

  • On-premises deployment: Tenable WAS is cloud-only; consider other options for air-gapped environments
  • Open-source solution: OWASP ZAP provides free DAST capabilities
  • Lower cost entry point: Per-FQDN pricing may be expensive for organizations with many small applications

Platform Integration

Tenable Web App Scanning integrates with the broader Tenable ecosystem:

  • Tenable.io Vulnerability Management: Correlate web app vulnerabilities with infrastructure risks
  • Tenable Attack Surface Management: Discover unknown web applications in your digital footprint
  • Tenable.sc (SecurityCenter): On-premises integration for hybrid environments
  • Tenable One Exposure Management: Unified cyber exposure visibility

The platform also exports findings to common formats and integrates with:

  • SIEM solutions (Splunk, QRadar, etc.)
  • Ticketing systems (Jira, ServiceNow)
  • GRC platforms (Archer, etc.)