🔴 CRITICAL: Fix SQL Injection in Product Search (Line 205)

Security Vulnerability: SQL Injection (CWE-89)

Severity: HIGH
Priority: CRITICAL - Fix Today
Location: app.py, line 205
Vulnerability ID: 238776714


📋 Summary

The /demo/search.html endpoint contains a critical SQL injection vulnerability where user input (search_term) is directly concatenated into SQL queries using f-strings, allowing attackers to manipulate database queries.

🎯 Exploitability Analysis

Risk Level: HIGHLY EXPLOITABLE

Code Flow:

  • Source: User input at line 172 (search_term from form)
  • Propagation: Line 172 → Line 172
  • Sink: SQL execution at line 205

Attack Vector:

# Attacker submits:
search_term = "' OR '1'='1' --"

# Results in query:
SELECT * FROM demo_products WHERE name LIKE '%' OR '1'='1' --%' OR description LIKE '%' OR '1'='1' --%'
# Returns all records, bypasses search logic

Advanced Attacks Possible:

  • Data exfiltration via UNION queries
  • Database structure enumeration
  • Potential authentication bypass
  • Data modification/deletion

💥 Impact

  • Complete database compromise
  • Unauthorized data access to all product records
  • Data theft of sensitive information
  • Data integrity violations (modification/deletion)
  • Authentication bypass in production systems
  • Compliance violations (GDPR, PCI-DSS)

🔧 Required Fix

Replace string concatenation with parameterized queries:

Current Vulnerable Code (Line 205):

vulnerable_query = f"SELECT * FROM demo_products WHERE name LIKE '%{search_term}%' OR description LIKE '%{search_term}%'"
cursor.execute(vulnerable_query)

Secure Implementation:

# Use parameterized queries with placeholders
safe_query = """
    SELECT * FROM demo_products 
    WHERE name LIKE ? OR description LIKE ?
"""
search_pattern = f'%{search_term}%'
cursor.execute(safe_query, (search_pattern, search_pattern))

Acceptance Criteria

  • Replace all f-string SQL queries with parameterized queries
  • Use ? placeholders for all user input
  • Pass user input as tuple parameters to execute()
  • Add input validation and sanitization as defense-in-depth
  • Test with SQL injection payloads to verify fix
  • Scan for other SQL injection vulnerabilities in codebase
  • Update security tests

🧪 Test Cases

Verify these inputs are safely handled:

"' OR '1'='1' --"
"'; DROP TABLE demo_products; --"
"' UNION SELECT username, password FROM users --"
"admin'--"

📚 References


Timeline: Fix required TODAY - classic attack vector with high exploitability