Skip to content
Launch GitLab Knowledge Graph

🔴 HIGH: SQL Injection in user preference queries

SQL Injection Vulnerability

Severity: HIGH (CVSS 8.6)

File: database/user_preferences.py:78-82

Vulnerable Code

def get_user_preferences(user_id):
    # ⚠️ VULNERABLE: String interpolation in SQL query
    query = f"SELECT * FROM user_preferences WHERE user_id = {user_id}"
    result = db.execute(query)  # SQL INJECTION!
    return result.fetchall()

Exploitation

# Normal request
user_id = "12345"
get_user_preferences(user_id)
# Query: SELECT * FROM user_preferences WHERE user_id = 12345

# Malicious request
user_id = "12345 OR 1=1; DROP TABLE user_preferences;--"
get_user_preferences(user_id)
# Query: SELECT * FROM user_preferences WHERE user_id = 12345 OR 1=1; DROP TABLE user_preferences;--
# Result: Entire table deleted!

Impact

  • Data Breach: Attacker can dump entire database
  • Data Loss: DROP TABLE commands
  • Privilege Escalation: Access other users' data
  • Compliance: GDPR/SOC2 violation

Affected Endpoints

  • GET /api/preferences/{user_id} (PUBLIC API)
  • POST /api/recommendations/feedback (user_id param)
  • GET /api/history/{user_id} (PUBLIC API)

Remediation

def get_user_preferences_safe(user_id):
    # ✅ SAFE: Parameterized query
    query = "SELECT * FROM user_preferences WHERE user_id = ?"
    result = db.execute(query, (user_id,))  # Parameters escaped automatically
    return result.fetchall()

Testing

9 pytest tests currently FAILING due to this vulnerability:

tests/test_security.py::test_sql_injection_user_id FAILED
tests/test_security.py::test_sql_injection_item_id FAILED
tests/test_security.py::test_sql_injection_category FAILED
...

Action Items

  • Fix all string interpolation in SQL queries (12 files)
  • Use parameterized queries or ORM (SQLAlchemy)
  • Add input validation and sanitization
  • Run SQLMap security scan
  • Fix failing security tests

Timeline: 1 week

cc: @dmitry @sabrina