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
sleep
statement 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' + 'f
will work in MySQL, but not in PostgreSQLasd' || 'f
is 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 POST example:
Sqlmap using a saved request:
Useful 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