DEV Community

Cover image for Application Security - SAST, SCA & DAST
Muhammad Awais Zahid
Muhammad Awais Zahid

Posted on

Application Security - SAST, SCA & DAST

Focus

This guide helps absolute beginners understand:

  • What SAST, SCA, and DAST are
  • Why we need all three
  • How security tools actually find vulnerabilities
  • How attackers exploit insecure applications
  • How developers should fix issues

You will build, scan, attack a real application.


Core Concepts (Before Touching Tools)

What is SAST?

Static Application Security Testing

  • Scans source code
  • Does not run the application
  • Finds insecure coding patterns
  • Best used early (IDE / Pull Requests)

Examples:

  • Hardcoded secrets
  • SQL injection patterns
  • Command execution risks
  • Insecure Deserialization (pickle)
  • Arbitrary Code Execution (eval/exec)
  • Unsafe YAML Loading (yaml.load)
  • Path Traversal (tarfile.extractall)
  • Insecure SSL/TLS (verify=False)
  • Weak Cryptography (MD5/SHA1 usage)
  • Insecure Temp Files (tempfile.mktemp)

Detailed Information

  • Hardcoded secrets: Storing sensitive data like passwords or API keys directly in your code where anyone who sees the file can steal them.
  • SQL injection patterns: Building database queries by gluing strings together, which lets hackers "trick" your database into deleting data or leaking secrets.
  • Command execution risks: Passing user input directly to your operating system, allowing a hacker to run any command (like format C:) on your server.
  • Insecure Deserialization (pickle): Using the pickle tool on data from the internet, which can automatically run hidden malicious code the moment the file is opened.
  • Arbitrary Code Execution (eval/exec): Using functions that turn text into live code, effectively giving a stranger the keyboard to your application.
  • Unsafe YAML Loading (yaml.load): Opening configuration files in a way that allows the file itself to trigger Python commands during the reading process.
  • Path Traversal (tarfile.extractall): Unzipping files without checking their names, which can let a malicious file overwrite important system files outside your project folder.
  • Insecure SSL/TLS (verify=False): Turning off "security checks" for internet connections, making it easy for hackers to spy on your encrypted data.
  • Weak Cryptography (MD5/SHA1 usage): Using "broken" mathematical formulas to hide data that modern computers can crack in seconds.
  • Insecure Temp Files (tempfile.mktemp): Creating a temporary file name without instantly "locking" it, creating a tiny window of time for a hacker to swap it with a malicious file.

What is SCA?

Software Composition Analysis

  • Scans dependencies
  • Matches versions against known CVEs
  • Answers: “Are we using vulnerable packages?”

Even perfect code can be insecure because of vulnerable libraries.


What is DAST?

Dynamic Application Security Testing

  • Attacks a running application
  • No access to source code
  • Simulates real attackers
  • Finds exploitable vulnerabilities

Why We Need All Three

Tool Code Dependencies Running App
SAST
SCA
DAST

👉 No single tool is enough.


Lab Overview

We will:

  1. Build a vulnerable Python app
  2. Run SAST using SonarQube
  3. Run SCA using pip-audit
  4. Run DAST using OWASP ZAP
  5. Compare findings
  6. Understand how to fix them

🏗️ Project Structure

vulnerable-app/
├── app.py
├── requirements.txt
├── users.db
└── sonar-project.properties
Enter fullscreen mode Exit fullscreen mode

Step 1: Vulnerable Application

app.py

from flask import Flask, request, jsonify
import sqlite3
import random

app = Flask(__name__)

DATABASE = "users.db"


def get_db():
    return sqlite3.connect(DATABASE)


@app.route("/")
def home():
    return "User Management Service"


@app.route("/user")
def get_user():
    user_id = request.args.get("id")

    conn = get_db()
    cursor = conn.cursor()

    query = f"SELECT id, username FROM users WHERE id = '{user_id}'"
    cursor.execute(query)

    user = cursor.fetchone()
    conn.close()

    if not user:
        return jsonify({"error": "User not found"}), 404

    return jsonify({"id": user[0], "username": user[1]})


@app.route("/token")
def generate_token():
    token = str(random.random())
    return jsonify({"token": token})


@app.route("/admin/calc")
def admin_calculate():
    expr = request.args.get("expr")
    result = eval(expr)
    return jsonify({"result": result})


if __name__ == "__main__":
    app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode

📦 Step 2: Vulnerable Dependencies

requirements.txt

flask==1.0
requests==2.19.1
Enter fullscreen mode Exit fullscreen mode

🔍 Step 3: SAST with SonarQube

Start SonarQube

docker run -d -p 9000:9000 --name sonarqube sonarqube:9.9-community
Enter fullscreen mode Exit fullscreen mode

Open http://IP:9000

Login: admin/admin


Image descriptionl1

sonar-project.properties

sonar.projectKey=vulnerable-python-app
sonar.projectName=Vulnerable Python App
sonar.sources=.
sonar.language=py
sonar.python.version=3
Enter fullscreen mode Exit fullscreen mode

Install Sonar Scanner

Follow the Instructions provided here:

https://docs.sonarsource.com/sonarqube-server/10.8/analyzing-source-code/scanners/sonarscanner

Install Sonar CLI

wget "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.0.1.6346-linux-x64.zip"
sudo apt update
sudo apt install unzip -y
unzip sonar-scanner-cli-8.0.1.6346-linux-x64.zip
sudo mv sonar-scanner-8.0.1.6346-linux-x64 /opt/sonar-scanner
nano ~/.bashrc
export SONAR_SCANNER_HOME=/opt/sonar-scanner
export PATH="$SONAR_SCANNER_HOME/bin:$PATH"
source ~/.bashrc

Enter fullscreen mode Exit fullscreen mode

Run Scan

sonar-scanner -Dsonar.host.url=http://IP:9000 -Dsonar.login=<TOKEN>
Enter fullscreen mode Exit fullscreen mode

Image descriptionl2

  • Check severity
  • Block merge if Critical/Blocker
  • Assign issue
  • Fix or justify
  • Re-run scan
  • Track metrics
  • Improve the process of recurring

Image descriptionl3

Image descriptionl4

Expected Findings

  • Hardcoded secrets
  • SQL injection risks
  • Command injection risks
  • Debug mode enabled

Step 4: SCA with pip-audit

sudo apt update
sudo apt install python3-venv python3-full -y
python3 -m venv venv
source venv/bin/activate
pip install pip-audit
pip-audit -r requirements.txt

Enter fullscreen mode Exit fullscreen mode

Image descriptionl5

Now, we will check that CVE on the internet

Image descriptionl6

Expected Findings

  • Vulnerable Flask version
  • Vulnerable Requests version

Application runs at http://IP:5000


🕷️ Step 6: DAST with OWASP ZAP

Run the Juice Shop Application

docker run -d \
  --name juice-shop \
  -p 3000:3000 \
  bkimminich/juice-shop
Enter fullscreen mode Exit fullscreen mode

Open in browser:

IP:3000
Enter fullscreen mode Exit fullscreen mode

Scan target by running ZAP from cli

docker run --rm \
  -v "$(pwd):/zap/wrk" \
  -t ghcr.io/zaproxy/zaproxy:stable \
  zap-baseline.py \
  -t http://IP:3000 \
  -r zap-report.html

Enter fullscreen mode Exit fullscreen mode

Image descriptionl8

Image descriptionl9

Scan target by running ZAP from UI

docker run -it \                                                                 
  -p 8080:8080 \
  ghcr.io/zaproxy/zaproxy:stable \
  zap-webswing.sh
Enter fullscreen mode Exit fullscreen mode

Open Zap UI:

http://localhost:8080/zap
Enter fullscreen mode Exit fullscreen mode

Compare Results

Issue SAST SCA DAST
Hardcoded Secret
Vulnerable Library
SQL Injection
Command Injection

🛠️ What to Fix Next

  • Use parameterised SQL queries
  • Remove shell=True
  • Move secrets to environment variables
  • Upgrade dependencies
  • Disable debug mode

Re-run scans and observe improvements 🚀


Top comments (1)

Collapse
 
jigar_online profile image
Jigar Shah

Indeed, SAST and DAST are two prominent methods for application security testing. SAST involves testing applications using the source code and DAST tests applications using simulated attacks.