SQL Injection
SQLi / SQL Injection
Manual Testing
How to test for SQL Injection manually.
Verify the Existence of SQL Injection
Broadly, to verify the existence of SQL injection in a given field you can try to either:
- Create an error 
- Use SQL operators and see if the data is changed according to SQL rules 
- Add a - sleepstatement to the SQL query
To create an error, you can:
- Add single and double quotes everywhere and see if it fails 
- If there is an integer ID, then you can try a negative value, since negative IDs usually don't exist 
Using operators, you can verify SQL like this:
- If there is an integer ID, then you can try to subtract from it. - ?id=11-1, and see if the result is the same as- ?id=10
 
- If there is a string value, then that's trickier. You can try to concatenate to it, but it's easy to create an error accidentally. - asd' + 'fwill work in MySQL, but not in PostgreSQL
- asd' || 'fis the SQL standard, but it will still create an error in MySQL, because MySQL expects it in between a pair of parentheses.
 
Union-Based Exploitation
You can query additional rows using UNION SELECT. Before you do that, you'll need to determine the amount of rows. You can use ORDER BY for that.
General Tips
Here are some things to remember:
- For commenting stuff out, use - --with a space at the end, because MySQL requires there to be a space.
- Don't forget to URLencode. - Browsers will omit extra spaces from the end of an URL, so your - --will become just- --and your exploit won't work for MySQL.
 
Filter Evasion
Using flexible MySQL syntax: https://websec.wordpress.com/2010/03/19/exploiting-hard-filtered-sql-injections/
Advanced ways to evade filters (using tricks like putting backslashes, using MySQL syntax, etc): https://websec.files.wordpress.com/2010/11/sqli2.pdf
SQL smuggling for evading filters: If INSERT is blacklisted, then do concat("INS", "ERT")
Also unicode smuggling: 'Ā' may default to 'A' and thus evade detection.
Automated Testing
Sqlmap GET example:
sqlmap -u "mysite.com/sql.php?param=1"Sqlmap POST example:
sqlmap -u "mysite.com/sql.php" --method "POST" --data "POST_DATA_HERE" Sqlmap using a saved request:
sqlmap -r saved_http_request.txtUseful flags:
- --level: Allows you to increase the sophistication level. Values- {1...5}
- --risk: Allows you to increase the potential damage the script might do. Values- {1...5}
- --random-agent: Random user agent
- -v3: Increase verbosity
- --cookie: set cookie
- --proxy: set a proxy
Last updated
Was this helpful?
