Understanding SQL injection vulnerabilities and secure database practices
3-hour session • 30 slides • 2 interactive tasks
Session Timeline:
10 min: Registration & waiting
20 min: Opening slides
45 min: Task 1
15 min: Break/Catch up
20 min: Secondary slides
45 min: Task 2
Remaining: Self-study
Learning Objectives
Understand OWASP A03: SQL Injection
Identify common SQL injection attack vectors
Learn secure database query practices
Practice vulnerability discovery using OS³ Studio
Implement secure database solutions
Explore career opportunities in database security
OWASP A03: SQL Injection
Definition: SQL injection occurs when malicious SQL code is inserted into application queries, allowing attackers to manipulate databases.
Key Attack Types:
Union-based injection
Boolean-based blind injection
Time-based blind injection
Error-based injection
Real-World Impact
Notable Breaches:
Heartland Payment Systems (2008): 130 million credit cards compromised
TalkTalk (2015): 157,000 customer records exposed
Yahoo (2013-2014): 3 billion accounts compromised
Impact: Data theft, financial loss, reputation damage
Common SQL Injection Vulnerabilities
1. String Concatenation
<!-- VULNERABLE: String concatenation -->
String query = "SELECT * FROM users WHERE username = '" + username + "'";
// Input: admin' OR '1'='1
// Result: SELECT * FROM users WHERE username = 'admin' OR '1'='1'
2. Dynamic Query Building
<!-- VULNERABLE: Dynamic queries -->
String query = "SELECT * FROM products WHERE category = " + categoryId;
// Input: 1; DROP TABLE users; --
// Result: SELECT * FROM products WHERE category = 1; DROP TABLE users; --
Union-Based Injection
Attack Technique:
<!-- Original query -->
SELECT name, email FROM users WHERE id = 1
<!-- Injected query -->
SELECT name, email FROM users WHERE id = 1 UNION SELECT username, password FROM admin_users
<!-- Result: Data from both tables -->
Impact: Unauthorized data access, information disclosure
Boolean-Based Blind Injection
Attack Technique:
<!-- Testing for vulnerability -->
SELECT * FROM users WHERE id = 1 AND 1=1 -- Returns data
SELECT * FROM users WHERE id = 1 AND 1=2 -- Returns no data
<!-- Extracting data character by character -->
SELECT * FROM users WHERE id = 1 AND ASCII(SUBSTRING(password,1,1)) > 65
SELECT * FROM users WHERE id = 1 AND ASCII(SUBSTRING(password,1,1)) > 66
Method: Use boolean conditions to extract data without direct output
Time-Based Blind Injection
Attack Technique:
<!-- Testing for vulnerability -->
SELECT * FROM users WHERE id = 1; WAITFOR DELAY '00:00:05' -- 5 second delay
<!-- Extracting data with timing -->
SELECT * FROM users WHERE id = 1 AND IF(ASCII(SUBSTRING(password,1,1)) > 65, SLEEP(5), 0)
<!-- If condition is true, response is delayed -->
Method: Use time delays to infer data without direct output
Error-Based Injection
Attack Technique:
<!-- Triggering database errors -->
SELECT * FROM users WHERE id = 1 AND (SELECT * FROM (SELECT COUNT(*),CONCAT(version(),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)
<!-- Error reveals database version -->
Duplicate entry '5.7.29-0ubuntu0.18.04.1' for key 'group_key'
Method: Exploit error messages to extract sensitive information
Second-Order SQL Injection
Attack Scenario:
<!-- Step 1: Store malicious input -->
INSERT INTO comments (text) VALUES ('admin''--');
<!-- Step 2: Later query uses stored data -->
SELECT * FROM users WHERE username = 'admin'--' AND password = 'password'
<!-- Result: Bypasses password check -->
Risk: Input validation doesn't prevent stored malicious data from being executed
NoSQL Injection
MongoDB Example:
<!-- VULNERABLE: Direct object injection -->
db.users.find({username: req.body.username, password: req.body.password})
<!-- SECURE: Limited database user permissions -->
-- Create application-specific user
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'strong_password';
-- Grant only necessary permissions
GRANT SELECT, INSERT, UPDATE ON webapp_db.users TO 'webapp'@'localhost';
GRANT SELECT ON webapp_db.products TO 'webapp'@'localhost';
-- No DROP, CREATE, or ALTER permissions
2. Database Connection Security
Use encrypted connections (SSL/TLS)
Implement connection pooling
Use strong authentication
Enable database audit logging
ORM Security
1. Safe ORM Usage
<!-- SECURE: Using ORM safely -->
// Good: Parameterized query
User user = session.createQuery("FROM User WHERE username = :username")
.setParameter("username", username)
.uniqueResult();
// Bad: String concatenation
String hql = "FROM User WHERE username = '" + username + "'";
User user = session.createQuery(hql).uniqueResult();
2. ORM-Specific Protections
Use parameterized queries in ORM
Avoid dynamic query building
Implement proper input validation
Use ORM's built-in security features
Web Application Firewall (WAF)
1. WAF Configuration
<!-- SECURE: WAF rules for SQL injection -->
# ModSecurity rules
SecRule ARGS "@detectSQLi" \
"id:1001,phase:2,block,msg:'SQL Injection Attack Detected',\
logdata:'Matched Data: %{MATCHED_VAR} found within %{MATCHED_VAR_NAME}',\
tag:'application-multi',tag:'language-multi',tag:'platform-multi',\
tag:'attack-sqli',severity:'CRITICAL'"