Overview
SQL Injection (SQLi) is a critical web security vulnerability that allows attackers to interfere with database queries by injecting malicious SQL code through user input fields. In this demo, the vulnerable login form concatenates user input directly into SQL queries, enabling complete authentication bypass.Severity Rating
CRITICAL - CVSS Score: 9.8/10CWE Reference: CWE-89: Improper Neutralization of Special Elements used in an SQL Command
Vulnerable Code
The vulnerable implementation invulnerable/app.py:26 uses string formatting to construct SQL queries:
vulnerable/app.py
Why This Is Dangerous
The vulnerability exists because:- Direct String Concatenation: User input is embedded directly into the SQL query using f-strings
- No Input Validation: The application doesn’t sanitize or validate special characters
- No Parameterization: The query doesn’t use prepared statements or parameterized queries
- Error Exposure: SQL errors are displayed to users (
vulnerable/app.py:43), revealing database structure
Exploitation Steps
Inject SQL Payload
Enter the following credentials to bypass authentication:
- Payload 1: OR Bypass
- Payload 2: Comment Bypass
- Payload 3: Always True
Username:
Password:The
adminPassword:
x' OR '1'='1This creates the query:OR '1'='1' always evaluates to TRUE, bypassing password verification.Impact Analysis
Confirmed in Demo
- Complete authentication bypass
- Access to admin accounts
- Session hijacking
- Database error information disclosure
Real-World Risks
- Full database extraction
- Data modification/deletion
- Privilege escalation
- Remote code execution (in extreme cases)
- Compliance violations (GDPR, PCI-DSS)
Advanced Exploitation
Beyond authentication bypass, SQL injection can be used for:Data Extraction
Database Enumeration
Boolean-Based Blind SQLi
Secure Implementation
The secure version insecure/app.py:54-63 properly prevents SQL injection:
Mitigation Strategies
1. Use Prepared Statements (Primary Defense)
1. Use Prepared Statements (Primary Defense)
Always use parameterized queries or prepared statements:Prepared statements ensure user input is treated as data, never as SQL code.
2. Input Validation & Sanitization
2. Input Validation & Sanitization
Validate all user input:
3. Use ORM Frameworks
3. Use ORM Frameworks
ORMs like SQLAlchemy automatically use parameterized queries:
4. Principle of Least Privilege
4. Principle of Least Privilege
Database users should have minimal necessary permissions:
5. Error Handling
5. Error Handling
Never expose SQL errors to users:
Detection and Prevention
Code Review Checklist
- All database queries use prepared statements/parameterized queries
- No string concatenation or f-strings in SQL queries
- Input validation on all user-supplied data
- Generic error messages (no SQL error exposure)
- Database user has minimal required privileges
- SQL injection testing in CI/CD pipeline
Testing Tools
SQLMap
Automated SQL injection testing tool
Burp Suite
Manual testing and vulnerability scanning
- Intruder for payload testing
- Scanner for automated detection
References
Next Steps
Explore related vulnerabilities:
- Password Storage - See how passwords should be hashed
- Session Management - Learn about session security
- IDOR - Understand authorization flaws